Код: Выделить всё
import logging
from typing import Generic, TypeVar
from typing import Self, Any, Type
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import Session
logger = logging.getLogger(__name__)
T = TypeVar('T')
class BaseRepository(Generic[T]):
model_cls: Type[T]
def __init__(self, session: Session | AsyncSession) -> None:
if not self.model_cls:
raise ValueError(f"Не задана модель в атрибуте `{self.__class__.__name__}.model_cls`")
self._session = session
self._flush = False
self._commit = False
def _clone(self) -> Self:
clone = self.__class__(self._session)
clone._flush = self._flush
clone._commit = self._commit
return clone
def flush(self) -> Self:
clone = self._clone()
clone._flush = True
return clone
def commit(self) -> Self:
clone = self._clone()
clone._commit = True
return clone
class AsyncRepository(BaseRepository):
async def create(self, **kw: Any) -> T:
obj = self.model_cls(**kw)
self._session.add(obj)
await self._flush_commit(obj)
return obj
async def _flush_commit(self, *objs: T) -> None:
if self._commit and objs:
await self._session.commit()
elif self._flush:
await self._session.flush(objs)
self._flush = False
self._commit = False
class SyncRepository(BaseRepository):
def create(self, **kw: Any) -> T:
obj = self.model_cls(**kw)
self._session.add(obj)
self._flush_commit(obj)
return obj
def _flush_commit(self, *objs: T) -> None:
if self._commit and objs:
self._session.commit()
elif self._flush:
self._session.flush(objs)
self._flush = False
self._commit = False
Код: Выделить всё
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker, declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)
engine = create_engine('sqlite:///db.db')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
class UsersRepo(SyncRepository):
model_cls = User
with Session() as session:
repo = UsersRepo(session)
repo.commit().create(name="asd", age=10)

Как исправить это предупреждение?
Подробнее здесь: https://stackoverflow.com/questions/798 ... s-baserepo
Мобильная версия