query(class1).join(class2)做什么?

时间:2013-11-20 19:19:28

标签: sqlalchemy

我创建了一个UserAddress类并填充了一些数据: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)做了什么?看起来像是一个内部联接,但事实并非如此。

1 个答案:

答案 0 :(得分:0)

JOINAddress 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}}。