在 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)