SQLAlchemy 0.7.8原始字符串查询问题与params

时间:2012-07-20 12:21:32

标签: python sqlalchemy pyramid

我正在使用SQLAlchemy和Pyramid应用程序,我需要使用'格式' paramstyle。例如:

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

这在理论上应该有效,但我得到了sqla错误:

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

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

我使用pg8000作为数据库驱动程序。

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

2 个答案:

答案 0 :(得分:6)

通过使用会话的execute方法,参数处理由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)

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

答案 1 :(得分: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。)