我想在仅附加的数据存储中重新实现我现有的一些 SQLAlchemy 模型;仅附加意味着对象仅使用 INSERT 语句更新,而不使用 UPDATE 或 DELETE 语句。
UPDATE 和 DELETE 语句将替换为另一个增加版本的 INSERT。将有一个is_deleted
标志,而不是 DELETE,is_deleted=True
将创建一个新版本:
id | version | is_deleted | name | description ...
---- --------- ------------ ----------- ---------------
1 | 1 | F | Fo | Text text text.
1 | 2 | F | Foo | Text text text.
2 | 1 | F | Bar | null
1 | 3 | T | Foo | Text text text.
此外,
- 所有 SELECT 语句都需要重写为每个 id 的最大版本号,如以下问题所述:PostgreSQL - fetch the row which has the Max value for a column
- 所有(唯一)索引都需要重写为由“id”主键唯一,因为每个 id 可能不止一次出现。
我知道如何解决大多数这些问题,但我正在努力处理 SQLAlchemy 中的事件挂钩,这些挂钩将处理某些需要在更新和删除时完成的事情。
SQLAlchemy 文档已经有一些基本的版本控制示例。版本化的行示例接近我想要的,但它们不处理 (1) 删除和 (2) 外键关系。
(1) 删除。我知道有一个session.deleted
字段,我会以与versioned_rows.pysession.dirty
示例中的迭代方式类似的方式对其进行迭代——但我如何从待删除列表中取消标记该项目并创建一个新项目?
(2) 上面的例子只处理了一个父子关系,它的处理方式(使关系过期)似乎需要为每个模型自定义代码。(2.1) 有没有办法让它更灵活?(2.2) 是否可以将 SQLAlchemy 配置relationship()
为返回给定外键的 max(version) 对象?