我正在尝试为我的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在特定版本+版本字段中的所有字段。
然而,我需要的是将关系版本化。例如,也许这个人过去常常有车,但现在不需要了,我需要获得他所拥有的版本。任何人都可以建议扩展示例的最佳方法,以实现这一目标吗?
答案 0 :(得分:2)
作为数据建模问题,您的问题可能更容易解决,而不是在SA中找出某个功能。在你的Person-Car示例中,可以将隐含的多对多关系(car_ownership_timeperiods)想象为Title,该对象记录了Person对汽车的所有权。
通过将隐式多对多关系表提升为模式中的完整对象,您可以保留关联人员和汽车的功能,并且还可以使用标题上的所有SA功能,包括跟踪历史记录你希望(虽然你的例子的查询,一个人过去拥有的汽车,是一个普通的equijoin)。