gpt4 book ai didi

python - SQLAlchemy 强制 in_() 使用文字

转载 作者:行者123 更新时间:2023-11-28 21:31:49 25 4
gpt4 key购买 nike

有没有办法强制过滤器中的 SQLAlchemy in_() 运算符将文字值传递给数据库,而不是为每个元素传递单独的绑定(bind)变量?

我必须为 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 查询计划的任何潜在 yield 都很重要。)

我希望它像行内文字一样发送这些值:

WHERE id IN (718, 714, 713, 715, 712, 711,
...
657, 656)

有没有办法完成这个(使用 in_() 或其他一些合适的结构)?请注意,我希望将查询的 IN 段变成这样的文字,而不是查询的所有其他部分。

[我确实看过SQLAlchemy filter in_ operator , 但没有从那里得到适合我的答案。]

最佳答案

在(撰写本文时)1.4 版中,您可以使用扩展的 bindparamliteral_execute=True 来实现您想要的效果:

In [2]: class Foo(Model):
...: id = Column(Integer, primary_key=True)
...: data = Column(Integer)

In [3]: metadata.create_all()

In [4]: session.query(Foo).\
...: filter(Foo.data.in_(
...: bindparam('xs', range(10), expanding=True, literal_execute=True))).\
...: all()
2019-09-07 20:35:04,560 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2019-09-07 20:35:04,561 INFO sqlalchemy.engine.base.Engine SELECT foo.id AS foo_id, foo.data AS foo_data
FROM foo
WHERE foo.data IN (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
2019-09-07 20:35:04,561 INFO sqlalchemy.engine.base.Engine ()
Out[4]: []

关于python - SQLAlchemy 强制 in_() 使用文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57427283/

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