gpt4 book ai didi

python - SQLAlchemy WHERE IN 单值(原始 SQL)

转载 作者:可可西里 更新时间:2023-11-01 07:56:27 28 4
gpt4 key购买 nike

在执行检查多个值的原始 SQL 时,我在使用 SQLAlchemy 时遇到了问题。

my_sess.execute(
"SELECT * FROM table WHERE `key`='rating' AND uid IN :uids",
params=dict(uids=some_list)
).fetchall()

此查询有 2 种情况,一种有效,另一种无效。如果 some_list = [1],它会向我抛出一个 SQL 错误,提示我在 ) 附近有语法错误。但是如果 some_list = [1, 2],查询会成功执行。

为什么会发生这种情况?

最佳答案

不,SQL 参数只处理标量 值。您必须在此处生成 SQL;如果您需要原始 SQL,请使用:

statement = "SELECT * FROM table WHERE `key`='rating' AND uid IN ({})".format(
', '.join([':i{}'.format(i) for i in range(len(some_list))]))

my_sess.execute(
statement,
params={'i{}'.format(i): v for i, v in enumerate(some_list)})
).fetchall()

例如生成足够的参数来保存 some_list 中所有的字符串格式的值,然后生成匹配的参数来填充它们。

更好的方法是使用 literal_column() object为您完成所有生成工作:

from sqlalchemy.sql import literal_column

uid_in = literal_column('uid').in_(some_list)
statement = "SELECT * FROM able WHERE `key`='rating' AND {}".format(uid_in)

my_sess.execute(
statement,
params={'uid_{}'.format(i): v for i, v in enumerate(some_list)})
).fetchall()

但是您也许可以使用 `sqlalchemy.sql.expression 模块生成整个语句,因为这将使支持多种数据库方言变得更加容易。

此外,uid_in 对象已经保存了对绑定(bind)参数正确值的引用; SQLAlchemy 不会像上面的 str.format() 操作那样将其转换为字符串,而是将实际对象加上相关参数,您将不再需要生成 params 字典 要么

以下应该有效:

from sqlalchemy.sql import table, literal_column, select

tbl = table('table')
key_clause = literal_column('key') == 'rating'
uid_clause = literal_column('uid').in_(some_list)
my_sess.execute(select('*', key_clause & uid_clause, [tbl]))

哪里sqlalchemy.sql.select()采用列规范(此处硬编码为 *),where 子句(从带有 & 的两个子句生成以生成 SQL AND条款)和可选列表;这是你的sqlalchemy.sql.table()值(value)。

快速演示:

>>> from sqlalchemy.sql import table, literal_column, select
>>> some_list = ['foo', 'bar']
>>> tbl = table('table')
>>> key_clause = literal_column('key') == 'rating'
>>> uid_clause = literal_column('uid').in_(some_list)
>>> print select('*', key_clause & uid_clause, [tbl])
SELECT *
FROM "table"
WHERE key = :key_1 AND uid IN (:uid_1, :uid_2)

但是从所有这些生成的实际对象树也包含绑定(bind)参数的实际值,因此 my_sess.execute() 可以直接访问这些。

关于python - SQLAlchemy WHERE IN 单值(原始 SQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21481541/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com