在 SQLAlchemy 中指定 "base" from-table
Specify "base" from-table in SQLAlchemy
假设我有 3 个 table:A、B、C。
A: id, fieldA
B: id, id_a, fieldB; id_a - foreign key for A.id
C: id, id_b, fieldC; id_b - foreign key for B.id
现在我想运行这个sql查询:
SELECT A.fieldA,
B.fieldB
FROM C
LEFT JOIN B
LEFT JOIN A
ON A.id = B.id_a
ON B.id = C.id_b
WHERE C.fieldC = :myvalue
SQLAlchemy 查询将是:
session.query(A.fieldA, B.fieldB).join(...).join(...).filter(C.fieldC == myvalue)
^------------------^ issue here
问题是所有联接都将应用于首先在查询中选择的 table,即在本例中为 A.
我可以使用一些虚拟技巧,例如:
session.query(C.fieldC, A.fieldA, B.fieldB).join(B).join(A).filter(C.fieldC == myvalue)
^------^ I don't need this column
但是,当然,这是不可取的。
有没有办法指定将附加所有连接的基 table?
根据您的示例,您需要:
- 使用
select_from
指定联接的左侧部分
- 并使用
outerjoin
(并且 而不是 内部联接)
我现在手头没有 SQLAlchemy,所以我不能保证它会工作 "out of the box",但是 类似 的东西会是一个很好的起点:
session.query(A.fieldA, B.fieldB) \
.select_from(C) \
.outerjoin(B, ....) \
.outerjoin(A, ....) \
.filter(C.fieldC == myvalue)
假设我有 3 个 table:A、B、C。
A: id, fieldA
B: id, id_a, fieldB; id_a - foreign key for A.id
C: id, id_b, fieldC; id_b - foreign key for B.id
现在我想运行这个sql查询:
SELECT A.fieldA,
B.fieldB
FROM C
LEFT JOIN B
LEFT JOIN A
ON A.id = B.id_a
ON B.id = C.id_b
WHERE C.fieldC = :myvalue
SQLAlchemy 查询将是:
session.query(A.fieldA, B.fieldB).join(...).join(...).filter(C.fieldC == myvalue)
^------------------^ issue here
问题是所有联接都将应用于首先在查询中选择的 table,即在本例中为 A.
我可以使用一些虚拟技巧,例如:
session.query(C.fieldC, A.fieldA, B.fieldB).join(B).join(A).filter(C.fieldC == myvalue)
^------^ I don't need this column
但是,当然,这是不可取的。
有没有办法指定将附加所有连接的基 table?
根据您的示例,您需要:
- 使用
select_from
指定联接的左侧部分
- 并使用
outerjoin
(并且 而不是 内部联接)
我现在手头没有 SQLAlchemy,所以我不能保证它会工作 "out of the box",但是 类似 的东西会是一个很好的起点:
session.query(A.fieldA, B.fieldB) \
.select_from(C) \
.outerjoin(B, ....) \
.outerjoin(A, ....) \
.filter(C.fieldC == myvalue)