SQLModel 关联关系(关联加载方式)
4. lazy加载方式参数
lazy是SQLAlchemy的一个参数,定义了多表关联的数据加载方式,关联关系的加载分为三类;延迟加载、急切加载和不加载。
- 延迟加载是指从查询返回对象,并不加载相关对象。而当第一次在特定对象上访问给定的集合或引用时,会发出附加的 SELECT 语句,以便加载所请求的集合。
- 预加载是指从查询返回对象,并且相关集合或标量引用已经预先加载。 在这种场景,ORM 可以通过JOIN 来同时加载相关行,或者通过在主语句之后发出附加 SELECT 语句来立即加载集合或标量引用来实现此目的。
- 不加载是指禁用给定关系的加载,要么该属性为空并且从未加载,要么在访问该属性时引发错误,以防止不需要的延迟加载。
lazy参数在SQLModel中的使用案例如下:
1 | class User(SQLModel, table=True): |
lazy参数常用取值:
- 延迟加载 - lazy=’select’`,这是一种加载形式,在属性访问时发出一条SELECT语句,一次延迟加载单个对象上的相关引用。是默认加载方式。
- select IN 加载 -
lazy='selectin'
,这种形式的加载会发出第二个(或更多)SELECT 语句,该语句将父对象的主键标识符组装到 IN 子句中,以便所有成员相关集合/标量引用通过主键立即加载。 - 联合加载 -
lazy='joined'
,这种形式的加载将JOIN应用于给定的SELECT语句,以便将相关行加载到同一结果集中。 - 引发异常 - lazy=’raise’
、
lazy=’raise_on_sql’`,这种形式的加载通常在延迟加载的同时触发,当尝试访问未加载的关联属性时,会引发一个异常,而不是自动执行查询。这种模式用于严格的数据访问控制,确保在访问关联数据前显式地加载它们。 - 子查询加载 - lazy=’subquery’`,这种形式的加载类似于连接加载,但使用子查询而不是直接JOIN。当查询父对象时,会生成一个针对关联对象的子查询,然后在主查询中使用子查询的结果作为过滤条件。这种方式在某些情况下可能会比直接JOIN性能更好,特别是在存在多对一或一对一关系并且关联对象有大量数据时,可以避免笛卡尔积问题。访问关联属性时,数据也已预先加载。
参考:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 AGI Explained!
评论