版本控制¶
原因¶
您有一个可以更改行内容的表,例如 wiki 页面表。您希望保留更改历史记录,以便进行审计、备份或跟踪。
您可以编写一个装饰器来存储旧版本,并通过它管理对该对象的所有访问。或者,您可以利用 SQLObject 0.8+ 中的事件系统,并仅捕获对该对象的行的访问。SQLObject 的版本控制模块会为您执行此操作。它甚至适用于继承!
方法¶
以下是如何设置它
class MyClass(SQLObject):
name = StringCol()
versions = Versioning()
要使用它,只需像往常一样创建一个实例
mc = MyClass(name='fleem')
然后进行一些更改并查看结果
mc.set(name='morx')
assert mc.versions[0].name == 'fleem'
您还可以还原到以前的版本
mc.versions[0].restore()
assert mc.name == "fleem"
继承¶
有三种方法可以将版本控制与继承结合使用
父版本控制,子未版本控制
class Base(InheritableSQLObject): name = StringCol() versions = Versioning() class Child(Base): toy = StringCol()
在这种情况下,当对 Base 的实例进行更改时,将创建新版本。但是,当对 Child 的实例进行更改时,将不会创建新版本。
- 子版本控制,父未版本控制。
在这种情况下,当对 Child 的实例进行更改时,将创建新版本。但是,当对 Base 的实例进行更改时,将不会创建新版本。Child 的版本数据包含 child 和 base 中的所有列,因此可以完全还原。
- 子版本控制和父版本控制。
在这种情况下,对 Child 或 Base 实例的更改都会创建新版本,但位于不同的表中。Child 版本仍然包含所有 Base 数据,而对 Child 的更改只会创建一个新的 Child 版本,而不是一个新的 Base 版本。