fix sqlalchemy many to x relationship loading

This commit is contained in:
Tom Villette
2023-10-12 12:24:56 +02:00
parent d8aa735a55
commit 4ce0b80196
2 changed files with 16 additions and 13 deletions

View File

@@ -26,7 +26,7 @@ async def reprocess(ep_items: Evepraisal, ep_mat: Evepraisal, efficiency: float
item_reprocess: List[PriceReprocess] = [] item_reprocess: List[PriceReprocess] = []
for rawitem in ep_items.items: for rawitem in ep_items.items:
# item = sde.exec(select(models_sde.Type).where(models_sde.Type.id == rawitem.typeID)).one() # item = sde.exec(select(models_sde.Type).where(models_sde.SDEType.id == rawitem.typeID)).one()
item = db.get(models_sde.SDEType, rawitem.typeID) item = db.get(models_sde.SDEType, rawitem.typeID)
buy_reprocess = sell_reprocess = 0.0 buy_reprocess = sell_reprocess = 0.0
for mat in item.materials.all(): for mat in item.materials.all():

View File

@@ -1,5 +1,8 @@
from typing import Optional, List from typing import Optional, List
from sqlmodel import SQLModel, Field, Relationship from sqlmodel import SQLModel, Field, Relationship
from functools import partial
DynamicRelationship = partial(Relationship, sa_relationship_kwargs={"lazy": "dynamic"}) # change default lazy loading to dynamic
class SDEIcon(SQLModel, table=True): class SDEIcon(SQLModel, table=True):
@@ -8,10 +11,10 @@ class SDEIcon(SQLModel, table=True):
description: Optional[str] = None description: Optional[str] = None
iconFile: str iconFile: str
categories: List['SDECategory'] = Relationship(back_populates="icon") categories: List['SDECategory'] = DynamicRelationship(back_populates="icon")
groups: List['SDEGroup'] = Relationship(back_populates="icon") groups: List['SDEGroup'] = DynamicRelationship(back_populates="icon")
marketgroups: List['SDEMarketGroup'] = Relationship(back_populates="icon") marketgroups: List['SDEMarketGroup'] = DynamicRelationship(back_populates="icon")
types: List['SDEType'] = Relationship(back_populates="icon") types: List['SDEType'] = DynamicRelationship(back_populates="icon")
class SDECategory(SQLModel, table=True): class SDECategory(SQLModel, table=True):
@@ -23,7 +26,7 @@ class SDECategory(SQLModel, table=True):
name: str name: str
published: bool published: bool
groups: List['SDEGroup'] = Relationship(back_populates="category") groups: List['SDEGroup'] = DynamicRelationship(back_populates="category")
class SDEGroup(SQLModel, table=True): class SDEGroup(SQLModel, table=True):
@@ -44,7 +47,7 @@ class SDEGroup(SQLModel, table=True):
published: bool published: bool
useBasePrice: bool useBasePrice: bool
types: List['SDEType'] = Relationship(back_populates="group") types: List['SDEType'] = DynamicRelationship(back_populates="group")
class SDEMarketGroup(SQLModel, table=True): class SDEMarketGroup(SQLModel, table=True):
@@ -61,9 +64,9 @@ class SDEMarketGroup(SQLModel, table=True):
parent_marketgroup_id: Optional[int] = Field(default=None, foreign_key="sdemarketgroup.id") parent_marketgroup_id: Optional[int] = Field(default=None, foreign_key="sdemarketgroup.id")
parent_marketgroup: Optional['SDEMarketGroup'] = Relationship(back_populates="children_marketgroups", parent_marketgroup: Optional['SDEMarketGroup'] = Relationship(back_populates="children_marketgroups",
sa_relationship_kwargs={"remote_side": 'SDEMarketGroup.id'}) # workaround for self reference: https://github.com/tiangolo/sqlmodel/issues/127#issuecomment-1224135123 sa_relationship_kwargs={"remote_side": 'SDEMarketGroup.id'}) # workaround for self reference: https://github.com/tiangolo/sqlmodel/issues/127#issuecomment-1224135123
children_marketgroups: List['SDEMarketGroup'] = Relationship(back_populates="parent_marketgroup") children_marketgroups: List['SDEMarketGroup'] = DynamicRelationship(back_populates="parent_marketgroup")
types: List['SDEType'] = Relationship(back_populates="marketgroup") types: List['SDEType'] = DynamicRelationship(back_populates="marketgroup")
class SDEType(SQLModel, table=True): class SDEType(SQLModel, table=True):
@@ -86,10 +89,10 @@ class SDEType(SQLModel, table=True):
volume: Optional[float] = None volume: Optional[float] = None
portionSize: int portionSize: int
materials: List['SDETypeMaterial'] = Relationship(back_populates="type", materials: List['SDETypeMaterial'] = DynamicRelationship(back_populates="type",
sa_relationship_kwargs={"foreign_keys": '[SDETypeMaterial.type_id]'}) # https://github.com/tiangolo/sqlmodel/issues/10#issuecomment-1537445078 sa_relationship_kwargs={"lazy": "dynamic", "foreign_keys": '[SDETypeMaterial.type_id]'}) # https://github.com/tiangolo/sqlmodel/issues/10#issuecomment-1537445078
material_of: List['SDETypeMaterial'] = Relationship(back_populates="material_type", material_of: List['SDETypeMaterial'] = DynamicRelationship(back_populates="material_type",
sa_relationship_kwargs={"foreign_keys": '[SDETypeMaterial.material_type_id]'}) # https://github.com/tiangolo/sqlmodel/issues/10#issuecomment-1537445078 sa_relationship_kwargs={"lazy": "dynamic", "foreign_keys": '[SDETypeMaterial.material_type_id]'}) # https://github.com/tiangolo/sqlmodel/issues/10#issuecomment-1537445078
class SDETypeMaterial(SQLModel, table=True): class SDETypeMaterial(SQLModel, table=True):