sqlalchemy 中的内连接与连接负载

问题描述 投票:0回答:2

我读到了有关 sqlalchemy

joinloads
的内容,就像这里提到的那样,我对简单地连接两个表(如这里

提到的)的好处或特殊用法有点困惑

我想知道什么时候使用每种方法,目前我还没有看到使用

joinloads
有什么好处,你能解释一下其中的区别吗?以及更喜欢的用例
joinloads

python python-2.7 sqlalchemy
2个回答
10
投票

Sqlalchemy 文档说

joinedload()
不能替代
join()
并且
joinedload()
不会影响查询结果:

Query.join()

Query.options(joinedload())

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

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

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

user = db.session.query(User).options(joinedload(User.addresses)).filter(id==1).one()

现在让我们看看加入:

user = db.session.query(User).join(Address).filter(User.id==Address.user_id).one()

结论

使用

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

其他查询,查询两个表,检查两个表上的用户id,所以结果依赖于此。但是

joinedload()
如果用户没有任何地址,您将有用户但没有地址。在
join()
中,如果用户没有地址,则不会产生结果。


0
投票

我不明白joinedload

不影响
到sql查询。我做了很多搜索,但只在实践中得到它:


# 1 with join
print(select(Person).join(MobilePhone))
# SELECT people.name, people.id 
# FROM people JOIN mobile_phones ON people.id = mobile_phones.person_id
# Result:
  name   | id 
---------+----
 person1 |  1


# 2 with joinedload
# SELECT people.name, people.id, mobile_phones_1.phone, mobile_phones_1.person_id, mobile_phones_1.id AS id_1 
# FROM people LEFT OUTER JOIN mobile_phones AS mobile_phones_1 ON people.id = mobile_phones_1.person_id
# Result:
  name   | id | phone  | person_id | id_1 
---------+----+--------+-----------+------
 person1 |  1 | phone1 |         1 |    1
 person2 |  2 |        |           |     

主要区别在于

join
使用 join - 这意味着内部联接,会更改查询,而
joinedload
使用外部联接 - 这不会影响查询,而只是联接

© www.soinside.com 2019 - 2024. All rights reserved.