У меня есть несколько несвязанных между собой моделей SQLAlchemy:
Код: Выделить всё
class Base(MappedAsDataclass, DeclarativeBase):
id: Mapped[primary_key] = mapped_column(init=False)
default_string = Annotated[str, mapped_column(String(100))]
class User(Base):
__tablename__ = "sample"
name: Mapped[default_string]
class Sample(Base):
__tablename__ = "sample"
value: Mapped[default_string]
location: Mapped[default_string]
Скажите:
Код: Выделить всё
T = TypeVar("T", bound=Base)
class Repository(ABC, Generic[T]):
def __init__(self, model: type[T]):
self.db = SessionLocal()
self.model = model
def list(self, skip: int = 0, limit: int = 100):
return self.db.query(self.model).offset(skip).limit(limit).all()
Код: Выделить всё
class SampleRepository(Repository[Sample]):
def get_by_name(self, name: str) -> list[Sample]:
return self.model.query.filter(name=name).all()
repository = SampleRepository(Sample)
Код: Выделить всё
class Repository(ABC, Generic[T]):
...
def create(self, **data) -> T:
instance = self.model(**data)
self.db.add(instance)
self.db.commit()
self.db.refresh(instance)
return instance
Код: Выделить всё
class SampleRepository(Repository[Sample]):
def create(self, name: str) -> Sample:
return super().create(
name=name,
)
Есть ли способ добиться этого? или я слишком многого требую от системы типов?
Подробнее здесь: https://stackoverflow.com/questions/791 ... a-subclass