首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

sqlalchemy joinedload:加载与查询表分离超过1度的多个关系的语法?

SQLAlchemy是一个Python的ORM(对象关系映射)库,它提供了一种将关系型数据库中的表映射为Python对象的方式。在SQLAlchemy中,joinedload是一种加载与查询表分离超过1度的多个关系的语法。

具体来说,joinedload可以用于在查询中一次性加载多个关联表的数据,而不是使用延迟加载的方式逐个加载。这样可以减少数据库查询的次数,提高查询效率。

使用joinedload时,需要先定义好模型之间的关系,然后在查询中使用joinedload来指定要加载的关联表。例如,假设有两个模型A和B,它们之间通过外键关联,可以这样使用joinedload来加载B表的数据:

代码语言:txt
复制
from sqlalchemy.orm import joinedload

query = session.query(A).options(joinedload(A.b))

上述代码中,通过joinedload(A.b)指定要加载A模型关联的B表的数据。这样在执行查询时,会一次性加载A表和B表的数据,而不是在访问A.b属性时再去查询B表。

joinedload的优势在于减少了数据库查询的次数,提高了查询效率。它适用于需要加载多个关联表数据的场景,特别是当关联表之间的距离较远时,使用joinedload可以避免多次查询的性能损耗。

对于使用SQLAlchemy的开发者来说,掌握joinedload的使用方法可以帮助他们优化数据库查询,提高系统性能。

腾讯云提供了云数据库 TencentDB for MySQL,它是一种高性能、可扩展的云数据库服务,适用于各种规模的应用场景。您可以使用TencentDB for MySQL来存储和管理应用程序的数据,并通过SQLAlchemy来进行数据访问和操作。

更多关于TencentDB for MySQL的信息和产品介绍,请访问腾讯云官网:TencentDB for MySQL

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

SqlAlchemy 2.0 中文文档(十九)

查询加载 - 可通过lazy='subquery'或subqueryload()选项使用,这种加载方式会发出第二个 SELECT 语句,该语句重新陈述了原始查询嵌入到子查询中,然后将该子查询加载相关...Select IN 加载还支持多对多关系,其中它当前将跨越所有三个进行 JOIN,以将一侧另一侧行匹配。...“子查询加载由 Yield Per 提供“批量”加载(对集合和标量关系均适用)不兼容。 出于上述原因,“selectin”策略应优先于“子查询”。...子查询加载 - 可通过lazy='subquery'或subqueryload()选项使用,这种加载方式会发出第二个 SELECT 语句,该语句重新陈述原始查询嵌入到子查询中,然后将该子查询相关进行...“子查询加载 Yield Per 提供“批量”加载不兼容,无论是集合还是标量关系。 由于上述原因,“选择”策略应优先于“子查询”。 另请参见 选择 IN 加载 使用什么类型加载

25110
  • SqlAlchemy 2.0 中文文档(七十七)

    JOIN 在处理连接继承结构时很常见;每当使用 Query.join() 从某个父类连接到一个连接子类,或者类似地使用 joinedload(),SQLAlchemy ORM 总是确保不会渲染嵌套...对于某些查询,子查询加载将在最内层 SELECT 上应用 DISTINCT 在涉及到一对多关系时,子查询加载可能会生成重复行数量,因此当连接目标列不包含主键时,会对最内层 SELECT 应用...子查询加载将对某些查询最内层 SELECT 应用 DISTINCT 为了减少在涉及到多对一关系时子查询加载可能生成重复行数,当连接目标是不包含主键列时,将在最内层 SELECT 中应用 DISTINCT...JOIN 在处理联接继承结构时很常见;每当使用Query.join()从某个父类连接到联接子类,或者类似地使用joinedload()时,SQLAlchemy ORM 总是确保不会呈现嵌套 JOIN...子查询急切加载将对某些查询最内部 SELECT 应用 DISTINCT 为了减少涉及多对一关系时子查询急切加载可能生成重复行数,当连接针对不包括主键列时,将在最内部 SELECT 中应用 DISTINCT

    13410

    SqlAlchemy 2.0 中文文档(八十)

    关系joinedload 上设置 innerjoin=True 现在可以指示连接急切加载标量和集合使用 INNER JOIN 而不是 OUTER JOIN。...多对一关系到一个连接子类现在使用 get()进行简单加载(称为“use_get”条件),即Related->Sub(Base),无需重新定义基 primaryjoin 条件。...连接子类多对一关系现在使用get()进行简单加载(称为“use_get”条件),即Related->Sub(Base),无需重新定义基主连接条件。...在关系joinedload 上设置 innerjoin=True 现在可以指示使用 INNER JOIN 而不是 OUTER JOIN 来连接预加载标量和集合。...对于连接子类多对一关系现在使用 get() 进行简单加载(称为“use_get”条件),即 Related->Sub(Base), 无需重新定义基主连接条件。

    18610

    SqlAlchemy 2.0 中文文档(三十三)

    : directed_graph.py ### 作为字典动态关系 演示如何在“动态”关系之上放置类似字典外观,以便字典操作(假设简单字符串键)可以在不一次加载完整集合情况下操作大集合。...第二次运行演示将利用已经存在缓存文件,并且仅会发出一条 SQL 语句来查询两个 - 但是显示结果将利用数十个懒加载,所有懒加载都从缓存中获取。...) 文件清单: directed_graph.py ### 动态关系作为字典 展示了如何在“动态”关系之上放置类似字典外观,以便字典操作(假设简单字符串键)可以在一次加载完整集合情况下操作大型集合。...: directed_graph.py 动态关系作为字典 演示了如何在“动态”关系之上放置类似于字典外观,以便字典操作(假设简单字符串键)可以在大型集合上进行操作,而无需一次加载整个集合。...relationship_caching.py - 展示了如何在关系终点添加缓存选项,以便惰性加载从缓存中加载

    30410

    SqlAlchemy 2.0 中文文档(七十三)

    随着这种用例变得更加流行,它局限性变得明显,包括非主映射器难以配置到可选择添加新列可选项上,映射器不继承原始映射关系,显式配置在非主映射器上关系加载器选项不兼容,非主映射器也没有提供可用于查询基于列属性完全功能命名空间...AliasedClass已经做了我们希望非主映射器做一切;它允许从替代可选择项加载现有映射类,继承现有映射器所有属性和关系加载器选项非常配合,提供一个类似类对象,可以像类本身一样混入查询中。...#4365 ### FOR UPDATE 子句在联合加载查询中以及外部呈现 此更改特别适用于使用joinedload()加载策略行限制查询结合使用时,例如使用Query.first()或Query.limit...#4365 ### FOR UPDATE 子句在联合贪婪加载查询中以及外部呈现 此更改特别适用于使用joinedload()加载策略行限制查询相结合,例如使用Query.first()或Query.limit...#4365 FOR UPDATE 子句在连接贪婪加载查询内部以及外部都被渲染 此更改特别适用于使用joinedload()加载策略行限制查询结合使用时,例如使用Query.first()或Query.limit

    20610

    SqlAlchemy 2.0 中文文档(五十六)

    ### “动态”关系加载器被“仅写”取代 概要 讨论 动态关系加载器 中讨论 lazy="dynamic" 关系加载策略使用了在 2.0 中已经过时 Query 对象。...### ORM 查询 - 使用属性而不是字符串进行关系连接/加载 概要 这指的是诸如Query.join()之类模式,以及查询选项,如joinedload(),它目前接受字符串属性名称或实际类属性混合...### “动态”关系加载器被“仅写入”取代 简介 讨论了lazy="dynamic"关系加载策略,详见动态关系加载器,它使用了在 2.0 中已经过时Query对象。...ORM 查询 - 在关系上进行链接/加载使用属性,而不是字符串 概要 这涉及Query.join()等模式,以及查询选项,如joinedload(),它目前接受混合字符串属性名称或实际类属性。...ORM 查询 - 使用属性列表进行链接链式调用,而不是单个调用,已移除 概要 “链接”形式连接和加载选项接受多个映射属性列表将被移除: # chaining removed q = session.query

    38810

    SqlAlchemy 2.0 中文文档(七十六)

    #3139 ### yield_per 明确不兼容连接/子查询加载 为了使 Query.yield_per() 方法更容易使用,如果在使用 yield_per 时要生效任何子查询加载程序,或者使用集合连接预加载程序...(100) ) ```### 处理重复连接目标的更改和修复 此处更改包括了一些 bug,当连接两次到一个实体时,或者连接到多个实体对同一张时会出现意外和不一致行为,而不使用基于关系 ON...,将引发异常,因为这些当前 yield-per 不兼容(子查询加载理论上可能是兼容)。...(100) ) 处理重复连接目标的更改和修复 这里更改涵盖了在某些情况下连接到实体两次或对同一多个实体进行多次连接时会发生意外和不一致行为错误,而不使用基于关系 ON 子句时,以及在多次连接到相同目标关系时...(A.b)).limit(5)) SQLAlchemy 认为关系 A.b 是“加载为单个值一对多”,实质上是“一对一”关系

    9910

    SqlAlchemy 2.0 中文文档(十五)

    但请注意,SQLAlchemy 无法 对超过一级级联发出 UPDATE。...另请参阅 动态关联加载器 - “动态”关联加载介绍。 secondaryjoin – 将用作关联子对象连接 SQL 表达式。默认情况下,此值根据关联和子表外键关系计算而来。...这对于快速限制特定关系路径上连接范围方式以及配置加载策略(如joinedload()和selectinload())非常有用。...有关这两种形式示例,请参见同时选择多个 ORM 实体部分。 链接多个 要构建一系列 JOIN,可以使用多个Select.join()调用。关系绑定属性同时暗示 JOIN 左侧和右侧。...对于像User.addresses这样一对多关系,可以使用PropComparator.any()针对user_account表相关联address进行 EXISTS 查询

    22910

    SqlAlchemy 2.0 中文文档(五十四)

    .limit(1) ).first() 注意,joinedload() 这种预加载策略不会遇到相同问题,因为只会发出一个查询,所以加载查询不会与主查询不同。....limit(1) ).first() 请注意,joinedload() 急加载策略不会遭受相同问题,因为只发出一次查询,因此加载查询不能与主查询不同。...“急加载”通常意味着使用连接,以便跨多个加载结果集,而不是随着深度增加而增加查询次数(即 r + r*r2 + r*r2*r3 …) 对于更长期查询分析,或者实现应用程序端“慢查询”监视器,...急加载”时,通常意味着使用连接以便在一个结果集中加载多个结果,而不是随着深度增加而增加查询次数(即 r + r*r2 + r*r2*r3 …) 为了更长期地分析查询,或者实现应用程序端“慢查询”...User.name == "jack" ... ).all() [(5, 'jack'), (5, 'jack')] Query 将去重主要原因有两个: 允许联接预加载正常工作 - 联接预加载通过使用相关连接来查询

    29810

    SqlAlchemy 2.0 中文文档(七十二)

    正则表达式语法和标志不是通用于所有后端。未来功能将允许一次指定多个正则表达式语法,以便在不同后端之间动态切换。...理由 此行为现在更加接近于其他种类加载选项,如在所有 SQLAlchemy 版本中,1.3 及更早版本已经复制到查询最顶层关系加载器选项,如 joinedload(),在 UNION 情况下已经复制到了查询顶层...理由 这种行为现在更加接近于其他种类加载器选项,例如所有 SQLAlchemy 版本中关系加载器选项,如joinedload(),其中在 UNION 情况下已经复制到查询最顶层,并且仅从 UNION...理由 这种行为现在更接近于其他类型加载器选项,比如在所有 SQLAlchemy 版本中,1.3 版本及更早版本中关系加载器选项joinedload(),在 UNION 情况下已经被复制到查询最顶层...理由 这种行为现在更接近于其他种类加载器选项,比如关系加载器选项,比如joinedload()在所有 SQLAlchemy 版本中,包括 1.3 和更早版本,这在 UNION 情况下已经复制到查询最顶层

    83210

    SqlAlchemy 2.0 中文文档(七十五)

    #3708 ### 改进了具有多态实体 Query.correlate 方法 在最近 SQLAlchemy 版本中,许多形式“多态”查询生成 SQL 比以前更“扁平化”,不再无条件地将多个...#3708 ### 改进 Query.correlate 方法多态实体 在最近 SQLAlchemy 版本中,许多形式“多态”查询生成 SQL 比以前更“扁平化”,其中多个 JOIN 不再无条件地捆绑到子查询中...#3708 改进查询 Query.correlate 方法多态实体 在最近 SQLAlchemy 版本中,许多形式“多态”查询生成 SQL 比以前更“扁平化”,其中多个 JOIN 不再无条件地捆绑到子查询中...”策略及相应加载器选项raiseload()应用于关系属性,这将导致在读取非急切加载属性时引发InvalidRequestError。...上重写连接以始终使用子查询以实现“右嵌套连接”效果,因为多年来 SQLite 并不支持这种语法

    31110

    SqlAlchemy 2.0 中文文档(十三)

    对于多对多集合批量更新和删除,为了使 UPDATE 或 DELETE 语句父对象主键相关联,关联必须明确地成为 UPDATE/DELETE 语句一部分,这要求后端包括对非标准 SQL 语法支持...必须通过 SQL 日志来确定所有必要属性是否已急切加载相比,“raise” 策略将在访问时立即引发未加载属性。raise 策略也可基于查询选项使用 raiseload() 加载器选项。...,该语法由 SQLite 和其他数据库支持,以在 WHERE 子句中命名额外audit_transaction。...对于批量更新和删除多对多集合,为了使 UPDATE 或 DELETE 语句父对象主键相关联,关联必须明确地包含在 UPDATE/DELETE 语句中,这要求后端包含对非标准 SQL 语法支持,或者在构建...当 Query 对象被要求返回完整实体时,将 基于主键去重 条目,这意味着如果相同主键值会出现在结果中超过一次,则该主键对象只会出现一次。这不适用于针对单个列查询

    20310

    SqlAlchemy 2.0 中文文档(五十五)

    在其他数据库中,为子查询命名仍然更清晰,以解决子查询内部列名任何歧义。 除了上述实际原因外,还有许多其他 SQLAlchemy 相关原因导致进行了更改。...当使用涉及加入继承映射进行查询时,通常会生成此警告。...### 关系 X 将列 Q 复制到列 P,关系‘Y’冲突 此警告指的是在刷新时两个或多个关系将写入相同列情况,但 ORM 没有任何手段来协调这些关系。...对于连接继承和其他基于连接映射,通常希望添加使用 aliased.flat 参数使用,这将允许通过将别名应用于连接中各个来对两个或多个进行 JOIN,而不是将连接嵌入到新查询中: >>>...这通常发生在对同一基础两个或多个关系中,这些关系包括限制每种情况中相关项自定义relationship.primaryjoin条件: class Parent(Base): __tablename

    41310

    SqlAlchemy 2.0 中文文档(十六)

    加载选项工作方式类似于selectinload()关系加载策略,对于在层次结构中加载对象,会对每个子表发出额外 SELECT 语句,使用IN来根据主键查询附加行。...它接受参数形式 selectin_polymorphic() 类似,即被查询基本实体,后跟一系列该实体子类,其特定属性应该被加载到传入行中: >>> from sqlalchemy.orm import...它接受参数形式 selectin_polymorphic() 相似,即被查询基本实体,后跟一系列这个实体子类,用于加载其特定属性传入行: >>> from sqlalchemy.orm import...()方法,如前一节中Select.join()方法所示,也可以等效地应用于关系加载器选项,例如selectinload()和joinedload()。...本节讨论单一继承,描述在单一继承中使用单个来表示层次结构中多个类。

    26410

    SqlAlchemy 2.0 中文文档(二十七)

    SQLAlchemy 1.0 中,这仅用于通过查询选项设置延迟加载器/延迟加载器。 以前,可调用函数还用于通过在此字典中存储 InstanceState 本身链接来指示过期属性。...标量多对多相比,关联别名也将被渲染,形成一个自然连接,作为查询主体一部分。这对于超出简单 AND 比较查询不起作用,例如使用 OR 查询。...标量一对多相比,将生成一个在父项中比较目标列给定目标的子句。 标量多对多相比,关联别名也将被呈现,形成查询主体一部分自然连接。...关联将呈现在语句中,生成一个“隐式”联接,即,在 WHERE 子句中包括多个: query(MyClass).filter(MyClass.contains(other)) 生成查询类似于: SELECT...从上面可以明显看出,当在超出简单 AND 连接查询中使用多个由 OR 连接Comparator.contains()表达式时,Comparator.contains()将不会与多对多集合一起工作。

    32610

    SqlAlchemy 2.0 中文文档(二十五)

    此对象表示查询关系“路径”,当加载特定对象或集合时。...mappings - 一个字典序列,每个字典包含要更新映射行状态,以映射类上属性名称表示。如果映射涉及多个,比如联接继承映射,每个字典可能包含所有对应键。...限制哪些列列延迟加载)并且尚未加载加载此对象查询中不存在,例如,在连接继承和其他场景中常见情况下。...mappings - 一个字典序列,每个字典包含要更新映射行状态,以映射类上属性名称表示。如果映射涉及多个,例如连接继承映射,每个字典可能包含所有对应键。...)且尚未加载加载此对象查询中不存在,例如在联接继承和其他场景中常见情况。

    19010

    SqlAlchemy 2.0 中文文档(五十九)

    为了解决这个问题,已经缩减了应用“多态加载条件,不再为简单继承查询调用它。...参考:#8115 sql [sql] [bug] 修复了lambda_stmt()相关多个观察到竞争条件,包括在多个同时线程中首次分析新 Python 代码对象时出现初始“dogpile...在后一种情况下,如果找不到 FK 相关,则会在resolve_fks=False情况下无法生成别名或子查询;逻辑已被修复,因此如果未找到相关,则ForeignKey对象仍会被代理到别名表或子查询...参考:#7823 [orm] [bug] [regression] 修复了“动态”加载策略中回归,其中Query.filter_by()方法在查询关系中存在“次要”且映射针对复杂内容(如“...参考:#7868 [orm] [错误] 修复了composite()属性连接继承selectin_polymorphic()加载策略不兼容错误。

    17110
    领券