我有 sql 查询,我试图在其中执行完整的外连接,这在 SQL 中运行良好,但在 Alchemy 中不起作用。
Select
Table1.field1 as Table1Field1, Table1.field2 as Table1Field2,
Table2.field1 as Table2Field1, Table2.field2 as Table2Field2,
Table3.field1 as Table3Field1, Table3.field2 as Table3Field2,
Table4.field1 as Table4Field1, Table4.field2 as Table4Field2,
Table5.field1 as Table5Field1, Table5.field2 as Table5Field2,
Table7.field1 as Table7Field1, Table7.field2 as Table7Field2
From Table1
full outer JOIN Table2 ON Table2.T1_id = Table1.id
full outer JOIN Table3 ON Table3.T1_id = Table1.id
full outer JOIN Table5 ON Table5.T1_id = Table1.id
full outer JOIN Table4 ON Table4.id = Table5.T4_id
full outer JOIN Table7 ON Table7.id = Table5.T7_id;
T1_id为Table1.id所有表中的外键
但是我在下面尝试的查询不断得到
Please use the .select_from() method to establish an explicit left side, as well as
providing an explcit ON clause if not present already to help resolve the ambiguity.
我尝试过的查询
session.query(Table1).join(Table2, Table3, Table4, Table5, Table7).
filter(Table2.T1_id = Table1.id, Table3.T1_id = Table1.id, Table4.T1_id =Table1.id, Table4.T5_id= Table5.id, Table4.T7_id = Table7.id).all()
我想要 sqlAlchemy 版本,我可以在其中获得 sql 查询中给出的完整外部联接。
More detailed error
"help resolve the ambiguity." % (right,)
sqlalchemy.exc.InvalidRequestError: Don't know how to join to <class 'model.Table4'>. Please use the .select_from() method to establish an explicit left side, as well as providing an explcit ON clause if not present already to help resolve the ambiguity.
答案 0 :(得分:0)
session.query(Table1).join(Table2, Table3, Table4, Table5, Table7).
filter(Table2.id = Table1.id, Table3.id = Table1.id, Table4.id = Table5.id, Table7.id = Table5.id).all()
我上面查询Table1、Table2、Table3连接,Table4、Table5 Table7连接但是这两组表没有连接。
这是一个很好的阅读: https://docs.sqlalchemy.org/en/13/orm/query.html#sqlalchemy.orm.query.Query.join.params.full
请在所有表之间建立连接然后添加full=true
session.query(Table1).join(Table2, Table3, Table4, Table5, Table7).
filter(Table2.id = Table1.id, Table3.id = Table1.id,
Table4.T1.id = Table1.id, Table4.id = Table5.id, Table7.id = Table5.id,full=true).all()