【发布时间】:2019-09-08 01:36:33
【问题描述】:
有没有办法强制过滤器中的 SQLAlchemy in_() 运算符将 literal 值传递给数据库,而不是每个元素的单独绑定变量?
我必须为IN 子句执行一个(MySQL)查询,其中可能包含大量值。 (IN (SELECT ...) 子查询在这里不是一个选项。)类似于:
query\
.join(something)\
.join(somethingelse)\
.with_entities(somecol, someothercol)\
.filter(somecol.in_(long_list_of_ids_in_a_list_variable))\
.order_by(somecol)\
.all()
为此,SQLAlchemy 将以下内容发送到 MySQL:
SELECT ... FROM ... JOIN ...
WHERE id IN (%(id_1)s, %(id_2)s, %(id_3)s, %(id_4)s, %(id_5)s, %(id_6)s,
...
%(id_49)s, %(id_50)s)
ORDER BY ...
{'id_1': 718, 'id_2': 714, 'id_3': 713, 'id_4': 715, 'id_5': 712, 'id_6': 711,
...
'id_49': 657, 'id_50': 656}
随着IN 项目的数量越来越大,此语句变得冗长且笨拙(例如,至少在调试期间)。 (我真的不认为通过使用变量重用 MySQL 查询计划的任何潜在收益是显着的。)
我希望它像行内文字一样发送这些值:
WHERE id IN (718, 714, 713, 715, 712, 711,
...
657, 656)
有没有办法做到这一点(使用in_() 或其他合适的构造)?请注意,我仅希望将查询的 IN 段转换为像这样的文字,而不是查询的所有其他部分。
[我确实看过SQLAlchemy filter in_ operator,但没有从那里得到适合我的答案。]
【问题讨论】:
标签: python mysql sqlalchemy