我正在阅读SQLAlchemy ORM教程(https://docs.sqlalchemy.org/en/latest/orm/tutorial.html#querying-with-joins),其中有一部分让我感到困惑,而不仅仅是帮助我:
如果有多个实体,查询将从中选择什么?
Query.join()方法通常从最左侧的项开始联接 省略ON子句或ON时的实体列表 子句是纯SQL表达式。控制中的第一个实体 列表,请使用Query.select_from()方法:
query = session.query(User, Address).select_from(Address).join(User)
“实体列表”是query()
中的列表吗?
更重要的是,何时会省略ON子句 not ?
用ON clause
表示像User.addresses
这样的关系,例如User.addresses = relationship(Address)
(以前定义为join(User.addresses)
)吗?因为“ select_from()
”参数本身将包含确定我们要与哪个表联接的必要信息,这种“ ON子句”的类型会阻止我们使用join()
吗?
肯定有某种方法可以指定联接目标,而不必始终将它们默认为query()
中的第一个表,因为否则将无法建立某些复杂的查询。
答案 0 :(得分:1)
让我们从头开始。将项目传递给query()时,它将根据这些项目构建SELECT语句。如果它们是模型,则将枚举此类模型的所有字段。查询将自动添加表以选择FROM。
除非您告知,否则查询将不会自动执行联接,因此您必须添加假定要从中查找表的表。诸如join()之类的附加子句告诉查询应如何执行JOIN操作。
join()的附加参数将用作ON子句,否则查询将根据映射器定义的关系推断该子句。
因此,总而言之,只要您不为join()指定附加参数,就会忽略ON子句。在以下表达式中,省略了ON子句:query(User, Address).join(Address)
这并不意味着发出的SQL将没有ON子句;通过使用模型上定义的关系来推断正确的ON子句,它将做正确的事。
有多种可能性时,您需要自己指定子句:query(Person).join(Person.parent1).join(Person.parent2)
会导致返回一个人及其两个父母的查询。在这种情况下,不会省略ON子句。