这是我的查询:
QUERY = """
UPDATE my_table
SET
my_prop=:foo
WHERE hello='world'
"""
我这样执行语句:
sqlalchemy_engine.execute(QUERY, foo='bar')
当我这样做时,出现以下错误:
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) syntax error at or near ":"
UPDATE my_table\n SET\n my_prop.foo = :foo
^
在将值传递到 SQL Alchemy 执行之前,我从未遇到过问题。我做错了什么?
最佳答案
I've never run into problems before passing values into the SQLAlchemy execute. What am I doing wrong?
您可能一直在使用 Session.execute()
之前,而不是 Engine.execute()
.前者自动用 text()
包装 SQL 字符串构造,或者至少它的行为如此,这是这里的关键; text()
为 DB-API 驱动程序提供绑定(bind)参数/占位符的独立处理。没有它,您就会随心所欲地使用 DB-API,as noted by Craig Ringer in their answer .
因此,为了直接在引擎中使用:name
样式的占位符,只需使用text()
包装您的查询:
sqlalchemy_engine.execute(text(QUERY), foo='bar')
请注意引擎 is the starting point SQLAlchemy 应用程序的所有内容都构建在它之上,因此这可能是一个不进行自动包装而另一个进行自动包装的原因。 session 是更高级别的抽象。
关于python - sqlalchemy.exc.ProgrammingError : (psycopg2. ProgrammingError) ":"处或附近的语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47190680/