Sqlalchemy:engine.execute() 的 PostgreSQL 参数样式
我正在使用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"))
这样看起来更好。