指定" base" SQLAlchemy中的from-table

时间:2015-04-06 18:31:07

标签: python sqlalchemy

假设我有3个表: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

问题是所有连接都将应用于首先在查询中选择的表,即在本例中为A。

我可以使用一些假的黑客:

session.query(C.fieldC, A.fieldA, B.fieldB).join(B).join(A).filter(C.fieldC == myvalue)
              ^------^ I don't need this column

但是,当然,这是不可取的。

有没有办法指定将附加所有连接的基表?

1 个答案:

答案 0 :(得分:2)

根据您的示例,您需要:

我现在手边还没有SQLAlchemy,所以我不能保证这会“开箱即用”,但之类这将是一个很好的起点:

session.query(A.fieldA, B.fieldB)        \
          .select_from(C)                \
          .outerjoin(B, ....)            \
          .outerjoin(A, ....)            \
          .filter(C.fieldC == myvalue)