如何使用一个SQLAlchemy模型保存到两个表

时间:2010-05-19 11:07:44

标签: python sql mysql sqlalchemy

我有一个链接到MySQL的SQLAlchemy ORM类,它非常适合将我需要的数据保存到基础表中。但是,我还想将相同的数据保存到 第二 存档表中。

这是一些尝试解释我的意思的psudocode

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 个答案:

答案 0 :(得分:3)

我在下面列出了一些选项。如果您不需要处理模型中的那些对象,我会选择DB触发器。

答案 1 :(得分:1)

创建2个相同的模型:一个映射到主表,另一个映射到归档表。使用重新定义的方法MapperExtension创建after_insert()(根据您的要求,您可能还需要after_update()after_delete())。此方法应将数据从主模型复制到存档,并将其添加到会话中。有一些技巧可以自动复制所有列和多对多关系。

请注意,您必须两次flush()个会话来存储两个对象,因为在mapper扩展将新对象添加到会话之前计算工作单元。您可以重新定义Session.flush()以解决此问题。刷新对象时也会分配自动增量字段,因此如果需要,还必须延迟复制。

这是一种可行的方案,证明是可行的。我想知道是否有更好的方法。