首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >‘sa_relationship_kwargs={“懒惰”:“selectin”}在Fastapi的SQLModel上是什么意思?

‘sa_relationship_kwargs={“懒惰”:“selectin”}在Fastapi的SQLModel上是什么意思?
EN

Stack Overflow用户
提问于 2022-03-14 08:20:50
回答 1查看 916关注 0票数 1

我试图在Fastapi中使用SQLModel,在我找到这个实现实体关系的示例的过程中,我想知道sa_relationship_kwargs={"lazy": "selectin"}意味着什么,它是做什么的?

代码语言:javascript
运行
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-14 09:37:07

它选择SQLAlchemy应该使用的关系加载技术

关系的加载可分为三类:延迟加载、急切加载和不加载。延迟加载指的是从查询中返回的对象,而不是最初加载的相关对象。当首次在特定对象上访问给定集合或引用时,将发出额外的SELECT语句,从而加载所请求的集合。

特别是在本例中,它使用了"select In加载“技术,这意味着将构造第二个查询,该查询通过WHERE parent_id IN (...)构造加载所有子对象。关于可用选项的详细信息

关系加载的主要形式是: 惰性加载--可以通过lazy='select'lazyload()选项获得,这是一种加载形式,它在属性访问时发出SELECT语句,以便一次在单个对象上延迟加载相关引用。延迟加载在延迟加载中有详细说明。 加入了加载--通过lazy='joined'joinedload()选项可用,这种加载形式将连接应用到给定的SELECT语句中,从而将相关的行加载到相同的结果集中。连接热切加载是详细的连接急切加载。 子查询加载--可通过lazy='subquery'subqueryload()选项获得,这种加载形式会发出第二条SELECT语句,该语句重新声明嵌入在子查询中的原始查询,然后将该子查询连接到要加载的相关表,同时加载相关集合/标量引用的所有成员。Subquery急切加载是在Subquery急切加载中详细描述的。 select into -可通过lazy='selectin'selectinload()选项获得,这种加载形式会发出第二个(或更多) SELECT语句,该语句将父对象的主键标识符组装到一个IN子句中,以便将相关集合/标量引用的所有成员同时按主键加载。在Select中,选择IN加载是详细的。 引发加载--可通过lazy='raise'lazy='raise_on_sql'或raiseload()选项获得,这种加载形式在正常情况下会被触发,除非它会引发ORM异常,以防止应用程序造成不必要的懒惰负载。提高负载的一个介绍是防止不必要的惰性负载使用上升负载。 没有加载--可以通过lazy='noload'noload()选项获得;这种加载样式将属性转换为一个空属性(None[]),该属性将永远不会加载或产生任何加载效果。这种很少使用的策略在加载对象时表现得有点像在放置空属性或集合时的急切加载器,但是对于过期的对象,则依赖于访问时返回的属性的默认值;除了属性名称是否出现在InstanceState.unloaded集合中之外,其净效果是相同的。noload对于实现“只写”属性可能很有用,但这种用法目前还没有经过测试或正式支持。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71464757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档