Я нашел два решения: проблематично:
- чтобы создать оператор обновления с явно измененными столбцами, я предпочитаю избегать этого подхода, поскольку он требует указания определенных полей при обновлении.
- Использование слияния, которое я не хочу использовать из-за его издержки производительности.
class UserDTO(BaseDTO):
tablename = "users"
id = Column(Integer, primary_key=True)
username = Column(String, unique=True)
email = Column(String)
class User:
def __init__(self, id: int, username: str, email: str):
self.id = id
self.username = username
self.email = email
T = TypeVar("T", bound=BaseDTO)
M = TypeVar("M")
class BaseDAO(ABC, Generic[M, T]):
def __init__(
self,
dto_class: type[T] = None,
session_loader: Callable[[], SessionManager] = load_session,
):
self.session_manager = session_loader()
self.dto_class = dto_class
def create(self, model: M) -> M:
dto = self.to_dto(model)
with self.session_manager.get_session() as session:
session.add(dto)
session.commit()
return model
def create_all(self, models: list[M]) -> list[M]:
dtos = [self.to_dto(model) for model in models]
with self.session_manager.get_session() as session:
session.add_all(dtos)
session.commit()
return models
@abstractmethod
def to_dto(self, model: M) -> T:
pass
@abstractmethod
def to_model(self, dto: T) -> M:
pass
class UserDAO(BaseDAO[User, UserDTO]):
def __init__(self, session_loader: Callable[[], SessionManager]):
super().__init__(dto_class=UserDTO, session_loader=session_loader)
def to_dto(self, model: User) -> UserDTO:
return UserDTO(id=model.id, username=model.username, email=model.email)
def to_model(self, dto: UserDTO) -> User:
return User(id=dto.id, username=dto.username, email=dto.email)
Подробнее здесь: https://stackoverflow.com/questions/793 ... fficiently
Мобильная версия