我在SQLAlchemy 0.6.8中使用ORM Mapping。
我有三个表(A,B和C),它们之间没有外键。
我正在尝试连接表A和B,然后将外部连接与C一起离开。我期待一个名为元组,字段为A,B和C - C字段有时设置为None。)
我可以通过选择两个表来轻松完成第一次连接。
(session.query(A, B)
.filter(A.some_field = B.some_other_field))
这让我得到了一个带有字段A和B的NamedTuple。
然后我添加外部联接,使其成为:
(session.query(A, B)
.filter(A.some_field==B.some_other_field))
.outerjoin((C, A.some_field==C.some_different_field))
结果仍然只有两个表。我无法访问C的其他字段(即使在它们存在的情况下)。
执行左外连接的正确方法是什么,才能访问最右边的表的字段?
如果我能避免它,我宁愿不回退到基本的SQL - 我正在努力学习利用ORM。
答案 0 :(得分:15)
这应该有效:
(session.query(A)
.join(B, A.some_field == B.some_other_field)
.outerjoin(C, A.some_field == C.some_different_field)
.add_entity(B)
.add_entity(C))
答案 1 :(得分:0)
对我自己的问题的暂时回答:
此代码似乎生成了我想要的SQL:
(session.query(A, B, C)
.filter(A.some_field==B.some_other_field))
.outerjoin((C, A.some_field==C.some_different_field))
请注意在原始session.query
调用中添加了C参数。
这似乎没有做我认为会做的事情:A加入B加入C再加入C再次加入。
我还在测试。