sqlalchemy 中的内连接与 joinloads

Jav*_*aSa 10 python sqlalchemy python-2.7

我读到了关于 sqlalchemy 的内容,joinloads就像这里提到的那样,我对简单地连接两个表(就像这里提到的那样)的好处或特殊用法有点困惑

我想知道什么时候使用每种方法,目前我没有看到使用它有什么好处joinloads,你能解释一下它们的区别吗?以及更喜欢的用例joinloads

met*_*irr 9

Sqlalchemy 文档说joinedload()不能替代join()也不joinedload()影响查询结果:

Query.join()

Query.options(joinedload())
Run Code Online (Sandbox Code Playgroud)

假设您想要获取与您正在查询的数据已经相关的相同日期,但是当您获取此相关数据时,它不会更改查询结果,它就像附件一样。最好看看sqlalchemy 文档 joinload

class User(db.Model):
    ...
    addresses = relationship('Address', backref='user')
class Address(db.Model):
    ...
    user_id = Column(Integer, ForeignKey('users.id'))
Run Code Online (Sandbox Code Playgroud)

下面的代码查询用户过滤器并返回该用户,并且您可以选择获取该用户地址。

user = db.session.query(User).options(joinedload(User.addresses)).filter(id==1).one()
Run Code Online (Sandbox Code Playgroud)

现在让我们看看加入:

user = db.session.query(User).join(Address).filter(User.id==Address.user_id).one()
Run Code Online (Sandbox Code Playgroud)

结论

查询joinedload()获取该用户地址。

其他查询,查询两个表,检查两个表上的用户id,所以结果取决于此。但joinedload()如果用户没有任何地址,您将有用户但没有地址。如果join()用户没有地址,则不会产生结果。