EN
Getflow
Getflow
2 subscribers
goals
0 of $ 1 069 money raised
Собираю на развитие новых интересных проектов

Немного о связях в SQLModel

По умолчанию связи(Relationship) в SQLModel подгружаются лениво селектами. Если код построен так, что сессия с БД на этот момент уже может умереть, вам нужно сменить стратегию подгрузки на joined. Пример:
```
class Team(SQLModel, table=True):
team_id: uuid.UUID
members: List["TeamMember"] = Relationship(back_populates="team")
class TeamMember(SQLModel, table=True):
member_id: uuid.UUID
team_id: uuid.UUID = Field(foreign_key="team.team_id")
team: "Team" = Relationship(back_populates="members", sa_relationship_kwargs={"lazy": "joined"})
```
Если же вам помимо того, чтобы получать из TeamMember поле team, нужно в Team обращаться к полю teams, стоит модифицировать этот код следующим образом:
```
class Team(SQLModel, table=True):
team_id: uuid.UUID
members: List["TeamMember"] = Relationship(back_populates="team", sa_relationship_kwargs={"lazy": "selectin"})
class TeamMember(SQLModel, table=True):
member_id: uuid.UUID
team_id: uuid.UUID = Field(foreign_key="team.team_id")
team: "Team" = Relationship(back_populates="members", sa_relationship_kwargs={"lazy": "joined"})
```
А в методе получения списка `Team`, добавить дополнительную строчку. Пример:
```
@staticmethod
async def get_list(
limit: int = 100, offset: int = 0
) -> List["Team"]:
async with async_session() as session:
return (
await session.exec(
select(Team).options(selectinload(Team.members))
.limit(limit)
.offset(offset)
)
).all()
```
PS: это повысит производительность в кейсах, когда поле нужно всегда(или нужно в подавляющем большинстве случаев)
Ссылка на доку: 
https://sqlmodel.tiangolo.com/tutorial/relationship-attributes/define-relationships-attributes/
https://docs.sqlalchemy.org/en/14/orm/loading_relationships.html

Subscription levels

No subscription levels
Go up