Как эффективно обновлять отдельные объектыPython

Программы на Python
Ответить
Anonymous
 Как эффективно обновлять отдельные объекты

Сообщение Anonymous »

Я читаю объект, например. UserModel, прочитав его, я преобразую его в свою бизнес-модель User. Служба затем изменяет пользователя на основе некоторой логики. Когда процесс закончится, я хочу обновить таблицу с изменениями. Моя первоначальная мысль заключалась в том, чтобы преобразовать пользователя в UserModel и вызвать что-то вроде session.update(user_model), однако этого метода не существует.
Я нашел два решения: проблематично:
  • чтобы создать оператор обновления с явно измененными столбцами, я предпочитаю избегать этого подхода, поскольку он требует указания определенных полей при обновлении.
  • Использование слияния, которое я не хочу использовать из-за его издержки производительности.
Пример:
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
Ответить

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

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

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

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

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