Sqlalchemy:engine.execute() 的 PostgreSQL 参数样式

2 投票
2 回答
4590 浏览
提问于 2025-04-16 23:41

我正在使用sqlalchemy连接到postgresql。当我尝试这段代码时:

e = create_engine('')
r = e.execute("select ?", 5)

它给了我这个错误:

sqlalchemy.exc.ProgrammingError: (ProgrammingError) syntax error at end of input

根据这个链接 http://www.sqlalchemy.org/docs/core/connections.html?highlight=engine#sqlalchemy.engine.base.Connection.execute,有不同类型的参数样式... 经过深入研究,我发现postgresql的默认参数样式是“pyformat”。

有人能给我举个例子,教我怎么使用这个pyformat吗? 我只是想用占位符或命名占位符来构建sql语句。

我尝试了:

e.execute("select %s, %s;", "test", "test2")

但这也不行。

谢谢

补充: 当然,我是把有效的连接字符串传递给create_engine方法的:-)

2 个回答

0

在SqlAlchemy 1.4发布之前,大家认可的答案是正确的。

如果现在有人在找这个问题的解决办法,这里有个方法:

session.connection().exec_driver_sql(
    "select %(param1)s, %(param2)s;", 
    {"param1": "test", "param2": "test2"}
)

https://docs.sqlalchemy.org/en/20/core/connections.html#sqlalchemy.engine.Connection.exec_driver_sql

4

你提供的文档直接链接到了PEP 249,这个文档展示了不同的格式风格。

关于pyformat,它提到:

'pyformat' 是Python扩展的格式代码,比如 '...WHERE name=%(name)s'

所以你需要使用这个。

如果你在网上搜索“DBAPI pyformat”,第二个链接就是psycopg2的文档。文档提到它使用了pyformat,接着有一个“另见”链接到一个有很多示例的页面

你最初链接中的示例是:

e.execute("select %s, %s;", ("param1", "test"), ("param2", "test2"))

你也可以使用这种语法:

e.execute("select %(param1)s, %(param2)s;", param1="test", param2="test2"))

这样看起来更好。

撰写回答