2012-07-24 64 views
3

我试图实现版本控制我的SQLAlchemy的数据库SQLAlchemy的版本(使用这里的例子:http://docs.sqlalchemy.org/en/rel_0_7/orm/examples.html#versioned-objects,并从源码包的history_meta.py)如何使用的关系

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

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

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

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

但是,我需要的是对关系进行版本控制。例如,也许这个人曾经有一辆车,但现在不再了,我需要得到他所拥有的版本。任何人都可以提出最好的方法来扩展这个例子,使之成为可能吗?

回答

2

作为一个数据建模问题,您的问题可能比解决SA中的一个功能更容易解决。在您的Person-Car示例中,可以将默认的多对多关系(car_ownership_timeperiods)想象为标题,该对象记录Person对Car的所有权。

通过将隐式多对多关系表提升为模式中的成熟对象,您可以保留关联人员和汽车的能力,并且还可以在标题上使用SA的所有功能,包括跟踪历史记录如果你愿意的话(尽管查询你的例子,一个人拥有过去的汽车是一个普通的等值线)。

+0

现在我试图用python VDM来解决这个问题,但是如果我仍然使用history_meta,我认为你的解决方案会是最好的。 – 2012-08-02 07:51:54