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

Python 如何实施";历史";对于数据库对象?,python,sqlalchemy,Python,Sqlalchemy,我目前正在Postgres上使用SQLAlchemy和Python 我感兴趣的是为模型实现一个“history”属性。这意味着每当修改数据库行时,该值的更改都会记录在某个地方 比如说, 我有一只狗模型。狗有两个属性:体重和主人 第1天:创建狗,weight=5,owner=None 第二天:Dog.体重=4 第三天:Dog.owner=me 这将产生如下历史记录: [ [1, weight=5, owner=None], [2, weight=4, owner=None], [3,

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

我感兴趣的是为模型实现一个“history”属性。这意味着每当修改数据库行时,该值的更改都会记录在某个地方

比如说,

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

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

第二天:
Dog.体重=4

第三天:
Dog.owner=me

这将产生如下历史记录:

[ [1, weight=5, owner=None], 
  [2, weight=4, owner=None], 
  [3, weight=4, owner=me] ]
  • Sqlalchemy中是否有任何现有的实现可以自动实现这一点
  • 如果没有,我应该如何优雅地实现这一点
    实际上,我不认为Postgresql有这个功能来存储表的历史记录,虽然我没有使用Postgresql,但它类似于MySQL。你可以使用两个表来实现你的功能。下面是一个示例(只是一个使用MySQL语法的示例):

    表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用于存储狗的历史记录

    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`)
    )
    
    现在,您可能想知道如何存储数据。
    当您想在数据库中保存新的狗数据时,请查询dog_now表以通过dog_id获得数据。并将数据放入dog_history表中,更新dog_now表中的新狗数据。

    因此每次dog添加新属性时,我也必须更新dog_history?@Sparrowcide Of cource,或者您可以使用Mongodb,您只需将其保存在db中。