我读到了有关 sqlalchemy
joinloads
的内容,就像这里提到的那样,我对简单地连接两个表(如这里提到的)的好处或特殊用法有点困惑
我想知道什么时候使用每种方法,目前我还没有看到使用
joinloads
有什么好处,你能解释一下其中的区别吗?以及更喜欢的用例 joinloads
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()
中,如果用户没有地址,则不会产生结果。
我不明白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
使用外部联接 - 这不会影响查询,而只是联接