Вот абстрактное определение репозитория.
Код: Выделить всё
from sqlmodel import SQLModel
import typing
from sqlalchemy.engine.result import ScalarResult
_ModelType = typing.TypeVar(
"_ModelType",
bound=SQLModel,
)
class BaseRepository(typing.Generic[_ModelType]):
def __init__(self, session: Session, model_class: typing.Type[SQLModel]):
self.session = session
self.__model_class = model_class
# Static hinting works as expected
def save(self, obj: _ModelType) -> _ModelType:
"""
Generic method to save an object to the database.
"""
self.session.add(obj)
return obj
def get_one(self, obj_id: typing.Any) -> typing.Optional[_ModelType]:
obj = self.session.get(self.__model_class, obj_id) #SQLModel | None
return obj
# Warning: Type "SQLModel" is not assignable to type "_ModelType@BaseRepository"
def query(self,
*conditions: typing.Union[_ColumnExpressionArgument[bool], bool]
) -> ScalarResult[_ModelType]:
stmt = select(self.__model_class)
for c in conditions:
stmt = stmt.where(c)
return self.session.exec(stmt).all()
#Similar warning along with: Type parameter "_T_co@Sequence" is covariant,
#but "SQLModel" is not a subtype of "_ModelType@BaseRepository"
< /code>
И вот основной пример использования (фактическая реализация завершает создание сеанса, управление, все репозитории и автоматическую коммит на выходе в Unitofwork Context Manager). < /p>
from utils.db_new import engine
from order_management.repository_new import BaseRepository
from order_management.models import Order, Customer
from sqlmodel import Session
import logging
logging.basicConfig(level=logging.INFO)
order_repo = BaseRepository[Order](Session(engine), Order)
all_orders = order_repo.query(
Order.pickup_type == "pickup",
Customer.name == "Diaa Malek",
)
[print(o.id) for o in all_orders]
order = order_repo.get_one(1088)
if order:
print(order.items)
< /code>
по функциональности, он работает точно так же, как и предполагалось. Каждый тип возврата аннотирован правильно. Я также мог бы просто ввести: игнорировать
Но я все еще не уверен, что понимаю эти предупреждения или как их избежать. Я не использую генерики каким-то образом, или это анти-паттерн или чрезмерное количество, которое не должно даже существовать? Я понимаю, что это не имеет никакого значения, но мне интересно.
Ссылки:
Разница между typevar ('t', a, b) и typevar ('t', bound = Union [a, b])
Схема репозиции
Подробнее здесь: https://stackoverflow.com/questions/795 ... tory-class