允许用户通过SQLAlchemy从数据库审计日志回滚

4 投票
1 回答
1287 浏览
提问于 2025-04-15 14:28

我最近开始使用SQLAlchemy来做一个新项目,打算实现一个审计跟踪功能,类似于下面这些问题中提到的内容:

因为我会保存“有趣”对象的完整历史记录,所以我在想能否让用户回滚到某个特定版本,这样他们就可以无限次地进行撤销操作。

用SQLAlchemy能否以一种干净的方式实现这个功能呢?

在内部API(业务逻辑和ORM)中,如何正确地展示这个功能呢?

我想的方式是像这样user.rollback(ver=42)

1 个回答

8

虽然我没有专门使用过SQLAlchemy,但我可以给你一些通用的建议,这些建议可以很容易地应用到任何对象关系映射(ORM)工具上:

  • 把版本化的项目分成两个表,比如叫做 DocumentDocumentVersionDocument 表里存放那些在不同版本之间永远不会改变的信息,而 DocumentVersion 表里存放那些会改变的信息。
  • 给每个 DocumentVersion 添加一个“父级”引用。也就是说,做一个外键,指向同一个表中的前一个版本。
  • 如果想回到之前的版本,可以通过更新 Document 中的引用,指向“当前”的版本。不要从链条的底部删除版本。
  • 当你在回滚之后创建新的版本时,这会形成另一个版本分支。

举个例子,创建 A、B、C,回滚到 B,然后创建 D、E:

(A)
 |
(B)
 | \
(C) (D)
     |
    (E)

撰写回答