0x5*_*6FF 5 python foreign-keys fastapi sqlmodel
我正在尝试将 SQLModel 与 Fastapi 结合使用,在路上我发现了这个用于实现实体关系的示例,我想知道这意味着什么sa_relationship_kwargs={"lazy": "selectin"}以及它有什么作用?
class UserBase(SQLModel):
first_name: str
last_name: str
email: EmailStr = Field(nullable=True, index=True, sa_column_kwargs={"unique": True})
is_active: bool = Field(default=True)
is_superuser: bool = Field(default=False)
birthdate: Optional[datetime]
phone: Optional[str]
state: Optional[str]
country: Optional[str]
address: Optional[str]
created_at: Optional[datetime]
updated_at: Optional[datetime]
class User(UserBase, table=True):
id: Optional[int] = Field(default=None, nullable=False, primary_key=True)
hashed_password: str = Field(
nullable=False, index=True
)
role_id: Optional[int] = Field(default=None, foreign_key="role.id")
role: Optional["Role"] = Relationship(back_populates="users", sa_relationship_kwargs={"lazy": "selectin"})
groups: List["Group"] = Relationship(back_populates="users", link_model=LinkGroupUser)
Run Code Online (Sandbox Code Playgroud)
\n\n关系的加载分为三类;延迟加载、急切加载和不加载。延迟加载是指从查询返回对象而没有首先加载相关对象。当第一次在特定对象上访问给定的集合或引用时,会发出附加的 SELECT 语句,以便加载所请求的集合。
\n
特别是在这种情况下,它使用“select IN 加载”技术,这意味着将构造第二个查询,通过构造加载所有子对象WHERE parent_id IN (...)。有关可用选项的详细信息:
\n\n关系加载的主要形式是:
\n延迟加载- 通过
\nlazy=\'select\'或lazyload()选项可用,这是一种加载形式,在属性访问时发出 SELECT 语句,一次延迟加载单个对象上的相关引用。延迟加载在延迟加载中有详细说明。联合加载- 通过
\nlazy=\'joined\'或joinedload()选项可用,这种形式的加载将 JOIN 应用于给定的 SELECT 语句,以便将相关行加载到同一结果集中。加入的渴望加载详细信息参见加入的渴望加载。子查询加载- 通过
\nlazy=\'subquery\'或subqueryload()选项可用,这种形式的加载会发出第二个 SELECT 语句,该语句重新声明嵌入子查询内的原始查询,然后将该子查询联接到要加载的相关表以加载相关集合的所有成员/一次标量引用。子查询预加载详细信息参见子查询预加载。select IN 加载- 通过
\nlazy=\'selectin\'或selectinload()选项可用,这种形式的加载发出第二个(或更多)SELECT 语句,该语句将父对象的主键标识符组装到 IN 子句中,以便加载相关集合/标量引用的所有成员立即通过主键。选择 IN 加载的详细信息参见“选择 IN 加载”。raise 加载- 可通过
\nlazy=\'raise\'、lazy=\'raise_on_sql\'或 raiseload() 选项使用,这种形式的加载通常会在延迟加载的同时触发,但它会引发 ORM 异常,以防止应用程序进行不需要的延迟加载。有关提升加载的介绍位于使用 raiseload 防止不需要的延迟加载。无需加载- 可通过
\nlazy=\'noload\'、 或noload()选项使用;此加载样式将属性转换为空属性(None或[]),永远不会加载或具有任何加载效果。当对象被加载时,这种很少使用的策略的行为有点像急切加载器,其中放置了空属性或集合,但是对于过期的对象,依赖于访问时返回的属性的默认值;除了属性名称是否出现在 InstanceState.unloaded 集合中之外,最终效果是相同的。noload 对于实现 \xe2\x80\x9cwrite-only\xe2\x80\x9d 属性可能很有用,但当前尚未测试或正式支持此用法。