Как сохранить в две таблицы, используя одну модель SQLAlchemy - PullRequest
1 голос
/ 19 мая 2010

У меня есть класс SQLAlchemy ORM, связанный с MySQL, который отлично работает при сохранении необходимых мне данных в базовой таблице. Однако я хотел бы также сохранить идентичные данные в секунду архивную таблицу.

Вот некоторый псевдокод, чтобы попытаться объяснить, что я имею в виду

my_data = Data() #An ORM Class
my_data.name = "foo"

#This saves just to the 'data' table
session.add(my_data)

#This will save it to the identical 'backup_data' table
my_data_archive = my_data
my_data_archive.__tablename__ = 'backup_data'
session.add(my_data_archive)

#And commits them both
session.commit()

Просто один на один, мне не интересно отображать класс в JOIN, как в: http://www.sqlalchemy.org/docs/05/mappers.html#mapping-a-class-against-multiple-tables

Ответы [ 2 ]

3 голосов
/ 19 мая 2010

Я перечислю некоторые варианты ниже. Я бы пошел на триггер БД, если вам не нужно работать с этими объектами в вашей модели.

1 голос
/ 19 мая 2010

Создание 2 идентичных моделей: одна сопоставлена ​​с основной таблицей, а другая сопоставлена ​​с архивной таблицей. Создайте MapperExtension с переопределенным методом after_insert() (в зависимости от ваших требований вам также могут понадобиться after_update() и after_delete()). Этот метод должен скопировать данные из основной модели в архив и добавить их в сеанс. Существуют некоторые приемы автоматического копирования всех столбцов и отношений «многие ко многим».

Обратите внимание, что вам потребуется flush() сеанс дважды, чтобы сохранить оба объекта, поскольку единица работы вычисляется до того, как расширение mapper добавит новый объект в сеанс. Вы можете переопределить Session.flush(), чтобы решить эту проблему. Также автоматически увеличиваемые поля назначаются, когда объект очищается, поэтому вам придется отложить копирование, если они вам тоже понадобятся.

Это один из возможных сценариев, который доказал свою эффективность. Я хотел бы знать, есть ли лучший способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...