【问题标题】:sqlalchemy with postgres: insert into a table whose columns have parentheses带有postgres的sqlalchemy:插入其列有括号的表中
【发布时间】:2014-11-13 02:14:47
【问题描述】:

假设您在 postgres 中有一个表 "foo",列名称为 "col (parens) name"。 psql 命令

INSERT INTO "foo" ("col (parens) name") VALUES ('bar');

工作得很好。但是,如果我尝试使用 sqlalchemy(版本 0.9.7)执行相同操作,则生成的 python 代码将失败:

conn = sqlalchemy.create_engine('postgresql://name:password@host:port/database')
meta = sqlalchemy.schema.MetaData()
meta.reflect(bind=conn)
foo = meta.tables['foo']
vals = [{'col (parens) name': 'hi'}, {'col (parens) name': 'bye'}]
conn.execute(foo.insert(values=vals))

这不起作用,给出以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "sqlalchemy/engine/base.py", line 729, in execute
    return meth(self, multiparams, params)
  File "sqlalchemy/sql/elements.py", line 321, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "sqlalchemy/engine/base.py", line 826, in _execute_clauseelement
    compiled_sql, distilled_params
  File "sqlalchemy/engine/base.py", line 957, in _execute_context
    context)
  File "sqlalchemy/engine/base.py", line 1162, in _handle_dbapi_exception
    util.reraise(*exc_info)
  File "sqlalchemy/engine/base.py", line 950, in _execute_context
    context)
  File "sqlalchemy/engine/default.py", line 436, in do_execute
    cursor.execute(statement, parameters)
KeyError: 'col (parens'

显然,绑定 db 参数的 sqlalchemy 方法在 python 字符串插值方面遇到了麻烦。有什么解决方法的建议吗?

【问题讨论】:

    标签: python postgresql sqlalchemy psycopg2


    【解决方案1】:

    paramstyle="format" 添加到create_engine 调用中。它将改变查询值插入查询的方式,不会在右括号上崩溃。

    conn = sqlalchemy.create_engine(
        'postgresql://name:password@host:port/database',
         paramstyle="format"
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-08
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 2012-05-17
      • 2020-11-30
      • 2017-07-13
      • 1970-01-01
      相关资源
      最近更新 更多