sqlalchemy.exc.ProgrammingError:(psycopg2.ProgrammingError)语法错误在":"或附近

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执行之前,我从未遇到过问题.我究竟做错了什么?

Ilj*_*ilä 6

在将值传递给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应用程序的起点,所有内容都建立在它之上,因此这可能是不进行自动换行的原因,而另一个则是.会话是更高级别的抽象.