gpt4 book ai didi

python - SQLAlchemy - 如何向查询添加动态左连接?

转载 作者:太空宇宙 更新时间:2023-11-04 00:49:13 25 4
gpt4 key购买 nike

我有六个表,建模如下:

+--< B >--C
|
A
|
+--< D >--E

我希望能够动态查询这些选项中的任何一个:

A
A, B, C
A, D, E
A, B, C, D E

例如,查询所有四个看起来像

q = session.query(A, B, C, D, E) \
.outerjoin(B, A.id == B.a_id).outerjoin(C, C.id == B.c_id)
.outerjoin(D, A.id == D.a_id).outerjoin(E, E.id == D.e_id)

我可以将模型附加到列表中并在 select 子句中动态使用它们。但是,我无法弄清楚如何动态附加连接。这是我目前所拥有的:

from sqlalchemy import outerjoin

models = [A]
joins = []

if foo:
models.append(B)
models.append(C)
joins.append(outerjoin(A, B, A.id == B.a_id))
joins.append(outerjoin(B, C, C.id == B.c_id))

if bar:
models.append(D)
models.append(E)
joins.append(outerjoin(A, D, A.id == D.d_id))
joins.append(outerjoin(D, E, E.id == D.e_id))

q = session.query(*models)
# How do I attach my joins list to this query?

我已经尝试了以下方法,但没有成功,即使成功了,我也认为 foobar 都是 False 会留下一个空的 FROM 子句。

q = q.select_from(*joins)

当然,我可以去掉 joins 列表并在执行 q = session.query(*models) 后重复 if 条件,如下所示,但我宁愿执行一次条件逻辑。

if foo:
q = q.outerjoin(B, A.id == B.a_id).outerjoin(C, C.id == B.c_id)

if bar:
q = q.outerjoin(D, A.id == D.a_id).outerjoin(E, E.id == D.e_id)

最佳答案

每个 outerjoin(和其他 SLQALchemy 查询方法)修改一个 query 对象并返回一个新查询 - 您可以通过调用 outerjoin 进一步修改>(或 filter 等...)方法。因此,只需使用 for 循环为您在条件中指定的每组 outerjoin 参数使用额外的 outerjoin 重复修改您的查询。参数本身可以只是你用 * 预先添加的元组,就像你为模型做的一样

models = [A]
joins = []

if foo:
models.append(B)
models.append(C)
joins.append((A, B, A.id == B.a_id))
joins.append((B, C, C.id == B.c_id))

if bar:
models.append(D)
models.append(E)
joins.append((A, D, A.id == D.d_id))
joins.append((D, E, E.id == D.e_id))

q = session.query(*models)
for join_args in joins:
q = q.outerjoin(*join_args)

# q is now ready to go with all outerjoins specified.

关于python - SQLAlchemy - 如何向查询添加动态左连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37892088/

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