我开始将 SQLAlchemy 用于一个新项目,我计划在该项目中实现类似于在此问题上提出的审计跟踪:

  • Implementing Audit Trail for Objects in C#?
  • Audit trails and implementing SOX/HIPAA/etc, best practices for sensitive data
  • Ideas on database design for capturing audit trails
  • What is the best implementation for DB Audit Trail?
  • Is this the best approach to creating an audit trail?
  • Good strategy for leaving an audit trail/change history for DB applications?
  • Data Auditing in NHibernate and SqlServer
  • Ideas on database design for capturing audit trails

  • 由于我已经拥有“有趣”对象的完整历史,我正在考虑允许用户回滚到给定版本,让他们有可能拥有无限的 undo

    这可以用 SQLAlchemy 以干净的方式完成吗?

    在内部 API(业务逻辑和 ORM)中公开此功能的正确方法是什么?

    我是 user.rollback(ver=42) 的一部分。

    最佳答案

    虽然我没有专门使用 SQLAlchemy,但我可以给你一些可以在任何 ORM 中轻松实现的通用技巧:

  • 将版本化项目分成两个表,比如 DocumentDocumentVersionDocument 存储在版本之间永远不会改变的信息,而 DocumentVersion 存储确实改变的信息。
  • 给每个 DocumentVersion 一个“父”引用。为同一个表创建一个外键,指向文档的先前版本。
  • 通过将 Document 的引用更新到“当前”版本来回滚到以前的版本。不要从链的底部删除版本。
  • 当他们回滚后制作新版本时,它会创建另一个版本分支。

  • 示例,创建A、B、C,回滚到B,创建D、E:
    (A)
     |
    (B)
     | \
    (C) (D)
         |
        (E)
    

    10-07 15:34