sqlalchemy relationship lazy属性

  1. 'select' (默认):
    • 懒加载 (Lazy Loading): 当访问与父对象关联的子对象集合或单个对象属性时,才会触发一次 SQL 查询,从数据库中获取相关数据。这是最常用的加载策略,因为它延迟了数据的获取,直到真正需要时才执行查询,有助于减少不必要的数据库交互。
  2. 'joined':
    • 连接加载 (Joined Load): 在查询父对象时,使用 SQL JOIN 语句一次性从数据库中获取父对象及其关联的子对象数据。这样,当访问关联属性时,数据已经存在于内存中,无需额外的数据库查询。适用于经常需要同时使用父对象和关联对象的场景,可以减少查询次数,提高性能,但可能导致查询结果集较大,尤其是当关联数据量较大时。
  3. 'subquery':
    • 子查询加载 (Subquery Load): 类似于连接加载,但使用子查询而不是直接JOIN。当查询父对象时,会生成一个针对关联对象的子查询,然后在主查询中使用子查询的结果作为过滤条件。这种方式在某些情况下可能会比直接JOIN性能更好,特别是在存在多对一或一对一关系并且关联对象有大量数据时,可以避免笛卡尔积问题。访问关联属性时,数据也已预先加载。
  4. 'immediate' (或 'eager'):
    • 即时加载 (Eager Loading): 在查询父对象时,立即通过额外的 SQL 查询获取关联的子对象数据,将关联数据与父对象一起返回。这通过使用 with_entities() 和 contains_eager() 函数来实现。即时加载可以在一次查询中获取完整的关联数据,减少了后续单独查询的需要,但如果关联数据量大或层次深,可能导致查询复杂度和数据传输量增加。
  5. 'dynamic':
    • 动态加载 (Dynamic Load): 提供了一种类似懒加载的体验,但在访问关联属性时,不会触发单个对象的加载,而是返回一个特殊类型的查询对象(通常是 SQL 查询生成器),可以进一步进行过滤、排序等操作后再执行查询。适用于需要灵活查询关联数据,或者关联数据量非常大且需要分页或筛选的情况。
  6. 'noload':
    • 不加载 (No Load): 关联属性被完全忽略,不会在任何查询中加载关联数据。当你明确知道不需要关联数据,或者为了防止意外加载而希望禁用某个关联时,可以使用此选项。
  7. 'raise':
    • 抛出异常 (Raise Error): 当尝试访问未加载的关联属性时,会引发一个异常,而不是自动执行查询。这种模式用于严格的数据访问控制,确保在访问关联数据前显式地加载它们。
  8. 'inline':
    • 内联加载 (Inline Load): 仅适用于一对一关系。将关联对象的列直接内嵌到父对象的查询结果中,使得关联对象看起来就像是父对象的一部分。这种加载方式可以简化查询结果结构,尤其适用于需要将数据序列化为扁平结构(如JSON)的场景。
posted @ 2024-04-08 11:13  zjyss  阅读(15)  评论(0编辑  收藏  举报