我创建了一个User
和Address
类并填充了一些数据:3个用户,6个地址,第一个用户有1个地址,第二个用户有2个地址,第三个用户有3个地址
如果我这样做
q = session.query(User).join(Address).all()
我将生成的SQL视为
SELECT user... FROM users JOIN addresses ON users.id = addresses.user_id;
正如所料。但是,当我打印q
时,我预计有6行,但我只得到3行,即3个用户。
如果我在sqlite3中发出SQL,我会得到我的6行。
那么,query(class1).join(class2)
做了什么?看起来像是一个内部联接,但事实并非如此。
答案 0 :(得分:0)
JOIN
上Address
WHERE
只会更改Users
子句,因此不会返回没有任何地址的query(User)
。而且,即使那些SQL查询返回6行,因为您仅向用户询问[(User, Address)
],它将只返回3个用户对象。
如果您想获得Address
元组的所有组合,您应该将query(...)
添加到q = session.query(User, Address).join(Address).all()
for user, address in q:
print user, address
部分:
outerjoin
将返回所有6行
如果您还希望退回没有任何地址的用户,请使用join
代替{{1}}。