Использование генериков для написания абстрактного класса objectrepositoryPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Использование генериков для написания абстрактного класса objectrepository

Сообщение Anonymous »

edit : как отмечено в комментариях @panagiotiskanavos, этот метод для взаимодействия с базами данных является избыточным. Поскольку основной вопрос связан с использованием Generics, я оставлю вопрос открытым. Sqlmodel надежда, что это удалит все предупреждения типа, но я все еще получаю предупреждения, когда я возвращаю sqlmodel типы в методах, которые ожидают _modeltype . Я также попытался ограничить _modeltype и SQLModel, но это не имело никакого значения.
Вот абстрактное определение репозитория.

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»