如何在关系上使用sqlalchemy版本控制

时间:2012-07-24 00:14:32

标签: sql sqlalchemy python-2.7

我正在尝试为我的sqlalchemy数据库实现版本控制(使用此处的示例:http://docs.sqlalchemy.org/en/rel_0_7/orm/examples.html#versioned-objects,以及源tarball中的history_meta.py.)

使用这个例子,我能够成功获得旧版本的对象:

history = Person.__history_mapper__.class_
old_person = history.filter(Person.id = instance.id, 
    history.version==someoldversion).one()

我也可以获得它指向的任何对象的旧版本。

在sqlalchemy版本控制代码中实现的方式是添加一个名为person_history的额外表。此表包含Person在特定版本+版本字段中的所有字段。

然而,我需要的是将关系版本化。例如,也许这个人过去常常有车,但现在不需要了,我需要获得他所拥有的版本。任何人都可以建议扩展示例的最佳方法,以实现这一目标吗?

1 个答案:

答案 0 :(得分:2)

作为数据建模问题,您的问题可能更容易解决,而不是在SA中找出某个功能。在你的Person-Car示例中,可以将隐含的多对多关系(car_ownership_timeperiods)想象为Title,该对象记录了Person对汽车的所有权。

通过将隐式多对多关系表提升为模式中的完整对象,您可以保留关联人员和汽车的功能,并且还可以使用标题上的所有SA功能,包括跟踪历史记录你希望(虽然你的例子的查询,一个人过去拥有的汽车,是一个普通的equijoin)。