版本控制

原因

您有一个可以更改行内容的表,例如 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"

继承

有三种方法可以将版本控制与继承结合使用

  1. 父版本控制,子未版本控制

    class Base(InheritableSQLObject):
        name = StringCol()
        versions = Versioning()
    
    class Child(Base):
        toy = StringCol()
    

在这种情况下,当对 Base 的实例进行更改时,将创建新版本。但是,当对 Child 的实例进行更改时,将不会创建新版本。

  1. 子版本控制,父未版本控制。

在这种情况下,当对 Child 的实例进行更改时,将创建新版本。但是,当对 Base 的实例进行更改时,将不会创建新版本。Child 的版本数据包含 child 和 base 中的所有列,因此可以完全还原。

  1. 子版本控制和父版本控制。

在这种情况下,对 Child 或 Base 实例的更改都会创建新版本,但位于不同的表中。Child 版本仍然包含所有 Base 数据,而对 Child 的更改只会创建一个新的 Child 版本,而不是一个新的 Base 版本。

版本表

版本存储在一个特殊表中,该表在创建版本化类的表时创建。当主表被更改时,版本表不会被更改,因此如果您向主类添加一个列,您将需要手动将该列添加到版本表中。

Get SQLObject at SourceForge.net. Fast, secure and Free Open Source software downloads