dop*_*man 5 python postgresql sqlalchemy
这是我的查询:
QUERY = """
UPDATE my_table
SET
my_prop=:foo
WHERE hello='world'
"""
Run Code Online (Sandbox Code Playgroud)
我执行这样的语句:
sqlalchemy_engine.execute(QUERY, foo='bar')
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我收到以下错误:
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) syntax error at or near ":"
UPDATE my_table\n SET\n my_prop.foo = :foo
^
Run Code Online (Sandbox Code Playgroud)
在将值传递给SQL Alchemy执行之前,我从未遇到过问题.我究竟做错了什么?
在将值传递给SQLAlchemy执行之前,我从未遇到过问题.我究竟做错了什么?
您可能以前一直在使用Session.execute(),而不是Engine.execute().前者自动用text()构造包装SQL字符串,或者至少它的行为如此,这是关键所在; 它为text()DB-API驱动程序提供绑定参数/占位符的独立处理.如果没有它,你就会在你的DB-API中随心所欲,正如Craig Ringer在回答中所指出的那样.
因此,为了直接使用:name带引擎的样式占位符,只需使用以下命令包装查询text():
sqlalchemy_engine.execute(text(QUERY), foo='bar')
Run Code Online (Sandbox Code Playgroud)
请注意,引擎是 SQLAlchemy应用程序的起点,所有内容都建立在它之上,因此这可能是不进行自动换行的原因,而另一个则是.会话是更高级别的抽象.
| 归档时间: |
|
| 查看次数: |
3124 次 |
| 最近记录: |