5

我将 SQLAlchemy 与 Pyramid 应用程序一起使用,我需要使用“格式”参数样式。例如:

DBSession.execute('SELECT id FROM users WHERE email = %s;', email)

这在理论上应该可行,但我得到 sqla 错误:

('SQL Error!', AttributeError("'list' object has no attribute 'keys'",))

即使email是字符串而不是列表。我尝试使用元组,但我得到了同样的错误(但不是“列表”,而是“元组”)。

pg8000用作数据库驱动程序。

我还应该如何为查询提供参数?

4

2 回答 2

8

通过使用executesession 的方法,参数处理由 SQLAlchemy 完成,因此您需要类似:

DBSession.execute('SELECT id FROM users WHERE email = :email;', {'email': email})

但是,如果您使用execute引擎的方法,则参数处理由底层 DB-API 完成,在这种情况下为 pg8000,例如

DBSession.bind.execute('SELECT id FROM users WHERE email = %s;', email)

无论如何,我总是坚持使用前者,以一致的方式处理不同驱动程序/数据库的参数。

于 2013-01-17T08:27:06.580 回答
1

阅读http://pybrary.net/pg8000/dbapi.html#pg8000.dbapi.CursorWrapper.execute它看起来pg8000.dbapi.paramstyle被设置为named因此它期望一个看起来像这样的映射:

DBSession.execute('SELECT id FROM users WHERE email = %(email)s', {'email': email})

看来您想要设置paramstyle哪个pyformat看起来最灵活的选项 - 允许序列或映射(或者format如果不需要,也可以只是)。

于 2012-07-20T12:46:26.637 回答