Sqlalchemy 查询(class1).join(class2)做什么?

Sqlalchemy 查询(class1).join(class2)做什么?,sqlalchemy,Sqlalchemy,我创建了一个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个用户 如果我

我创建了一个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行


那么,QueryCass1.joinclass2做什么?看起来像一个内部连接,但它不是。

您在地址上也有连接这一事实只会更改WHERE子句,因此它不会返回那些没有任何地址的用户。而且,即使SQL查询返回6行,因为您只为用户询问[queryUser],所以它只返回3个用户对象

如果您想获得用户、地址元组的所有组合,您应该向查询中添加地址。。。第二部分:

q = session.query(User, Address).join(Address).all()
for user, address in q:
    print user, address
这将返回所有6行。 如果您还希望返回那些没有任何地址的用户,请使用outerjoin而不是join