4

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

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

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

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

我是一些东西user.rollback(ver=42)

4

1 回答 1

8

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

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

例子,创建A,B,C,回滚到B,创建D,E:

(A)
 |
(B)
 | \
(C) (D)
     |
    (E)
于 2009-09-21T15:18:37.377 回答