use*_*978 6 python postgresql sqlalchemy psycopg2
假设您"foo"在 postgres 中有一个表,其列名称为"col (parens) name"。psql 命令
INSERT INTO "foo" ("col (parens) name") VALUES ('bar');
Run Code Online (Sandbox Code Playgroud)
工作得很好。但是,如果我尝试使用 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))
Run Code Online (Sandbox Code Playgroud)
这不起作用,出现以下错误:
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'
Run Code Online (Sandbox Code Playgroud)
显然,用于绑定 db 参数的 sqlalchemy 方法在 python 字符串插值方面遇到了麻烦。有关解决方法的任何建议?
添加paramstyle="format"到create_engine通话中。它将改变查询值插入查询的方式,使其不会在结束括号时崩溃。
conn = sqlalchemy.create_engine(
'postgresql://name:password@host:port/database',
paramstyle="format"
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1418 次 |
| 最近记录: |