【问题标题】:SQLAlchemy 0.7.8 raw string queries issue with paramsSQLAlchemy 0.7.8 带有参数的原始字符串查询问题
【发布时间】:2013-01-19 05:34:25
【问题描述】:

我在 Pyramid 应用程序中使用 SQLAlchemy,我需要使用“格式”参数样式。例如:

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

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

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

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

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

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

【问题讨论】:

  • 当你遇到 python 错误时,请包含完整的回溯。

标签: python sqlalchemy pyramid


【解决方案1】:

通过使用会话的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)

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

【讨论】:

    【解决方案2】:

    通读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)。

    【讨论】:

    • 是的,但默认 sqlalchemy paramstyle 设置为 format(我也尝试使用 engine.dialect.paramstyle = 'format' 设置它,我不确定是否有任何其他方法可以更改 paramstyle使用 sqlalchemy 时。我真的很想使用任何其他 paramstyle,但我们需要在几个单独的应用程序中使用相同的文本查询,其余的使用 format
    • @MarekSzwalkiewicz pg8000.dbapi.paramstyle 当前设置为什么? (显然默认应该是format
    • 我不确定我是否可以通过 sqlalchemy 访问 pg8000 对象,我正在使用 engine_from_config 设置所有内容 - 所以我担心我无法使用 pshell 检查它,但默认设置为format,不应被sqlalchemy覆盖。
    猜你喜欢
    • 2015-05-26
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 2020-12-22
    • 2015-06-09
    • 2016-07-10
    相关资源
    最近更新 更多