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有不同类型的paramstyles…经过深入的研究,我发现postgresql方言的默认参数样式是"pyformat"。

谁能告诉我如何在一些例子中使用这个pyformat ?我只是想使用占位符或命名占位符来形成sql语句。

我试着:

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

但是这个也不行

谢谢

编辑:当然,我将有效的连接字符串传递给create_engine方法:-)

您链接到的文档直接链接到PEP 249,它向您展示了不同的样式。

关于pyformat它说:

'pyformat' Python扩展格式代码,例如:"…name = %(名字)s '

这就是你需要使用的

在google上搜索"DBAPI pyformat",第二个链接是psycopg2文档的链接。在提到它使用pyformat之后,有一个"See Also"链接到一个包含大量示例的页面。

如何使用它的例子在你的原始链接:

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

你也可以使用这种语法:

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

哪个更好

在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

最新更新