如何实施"历史"对于数据库对象?

时间:2017-06-11 03:56:29

标签: python sqlalchemy

我目前正在Postgres上使用SQLAlchemy和Python

我有兴趣实施"历史"模型的属性。这意味着无论何时修改数据库行,都会在某处记录此值的更改。

例如,

我有一只模特狗。狗有两个属性:体重和主人。

第1天:创建了狗,weight=5, owner=None

第2天:Dog.weight=4

第3天:Dog.owner=me

这将导致历史记录:

[ [1, weight=5, owner=None], 
  [2, weight=4, owner=None], 
  [3, weight=4, owner=me] ]
  1. Sqlalchemy中是否有现成的自动执行功能?
  2. 如果没有,我该如何优雅地实现这个目标?

1 个答案:

答案 0 :(得分:0)

实际上,我不认为Postgresql有这个功能来存储表的历史,虽然我不使用Postgresql,但它与MySQL类似。你可以使用两个表来实现你的功能。这是一个例子(只是一个使用MySQL语法的例子):

Table 1: 
CREATE TABLE `dog_now`(
    `id` int(11) AUTO_INCREMENT ,
    `dog_id` int(11) DEAFULT '0',   -- dog id
    `weight` float DEFAULT '0',
    `owner` varchar(32) DEFAULT '',
    PRIMARY KEY(`id`),
    UNIQUE KEY `idx_dog_id`(`dog_id`)
)

表1用于存储狗的当前状态。

Table 2:
CREATE TABLE `dog_history`(
   `id` int(11) AUTO_INCREMENT,
   `dog_id` int(11) DEAFULT '0',   -- dog id
   `weight` float DEFAULT '0',
   `owner` varchar(32) DEFAULT '',
   PRIMARY KEY (`id`),
   KEY `idx_dog_id`(`dog_id`)
)

表2用于存储狗的历史。

现在,您可能想知道如何存储数据。 如果要将新狗数据保存在数据库中,请查询dog_now表以通过dog_id实现数据。并将数据放入dog_history表,在dog_now表中更新新的狗数据。