我正在使用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
作为数据库驱动程序。
我还应该如何为查询提供参数?
答案 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
。)