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

标签 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 在特定版本中的所有字段 + 版本字段。

但是,我需要的是对关系进行版本控制。例如,也许这个人曾经有一辆汽车,但现在没有了,我需要得到他(她)拥有的版本。任何人都可以建议扩展示例以使其成为可能的最佳方法吗?

最佳答案

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

通过将隐式多对多关系表提升为模式中的完整对象,您保留了关联人员和汽车的能力,并且还可以在标题上使用 SA 的所有功能,包括跟踪历史(如果您愿意)尽管对您的示例的查询(一个人过去拥有哪些汽车)是一个简单的 equijoin)。

关于sql - 如何在关系上使用 sqlalchemy 版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11622374/

相关文章:

mysql - MySQL 中函数 'count(*)' 返回的限制(截止)数

python - SQLAlchemy 查询如何使用 MySQL 的 REGEXP 运算符?

python - 比较两个字典并打印差异

python - Python 中的 Microsoft Visual C++ 运行时错误

python - wx.Image 抛出 PyAssertionError

sql - Oracle查询计算当前年龄

sql - T-SQL 字符串替换

sql - 查询、 native 查询、命名查询和类型化查询之间的区别

python - 如何在Sqlalchemy中加载数量有限的集合?

sqlalchemy - 更新 Snowflake 中的混合和嵌套对象