【问题标题】:How to implement "History" for a database object?如何为数据库对象实现“历史”?
【发布时间】:2017-06-11 12:27:42
【问题描述】:

我目前在 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. 如果没有,我应该如何优雅地实现它?

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    实际上,我不认为 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表中的新狗数据。

    【讨论】:

    • 所以每次 dog 添加新属性时,我也必须更新 dog_history?
    • @Sparrowcide 当然,或者你可以使用Mongodb,你只需将它保存在db中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多