首页 > 解决方案 > 如何在 SQLAlchemy,Python 中使用 JSON 将更新后的数据和更新前的数据插入到表中?

问题描述

我想显示原始数据和修改后的数据之间的区别,在尝试了很多方法之后,我们决定将更新后的数据和更新前的数据插入到一个history_table用 JSON 调用的表中。

如何将更改的字典和更新的字典插入下表?

# table of `history_table`
before_updated                    updated             updated_time
  json of before_updated       json of updated           datetime

下面的代码将更新来自不同表的 15 行(示例代码只有一个表),所以需要更改和保存很多表,我被困了很多天,非常感谢任何建议。

 class GetTestDetail(Resource):
    args = self.test.parse_args()
    print(args)
    id = args.get("id")
    def get(self):
        # get something
        data = db.session.query(Test.name, Test.days).filter(Test.id == id).first()
        return dict(data=data)

    def put(self):
        # change something
        args = self.test.parse_args()
        test = args.get("test")
        dict_test = db.session.query(Test).filter_by(id=id).first()
        test["name"] = 'Alice'
        test["days"] = 12
        {setattr(dict_test, k, v) for k, v in test.items()}
        db.session.commit()

        return {"status": True, "message": "Successfully"}
    except Exception as e:
        db.session.rollback()
        return {"status": False, "message": "Failed"}

标签: pythonjsonflaskflask-sqlalchemy

解决方案


我认为您的问题与代码无关。首先是理解逻辑或选择一种方法,然后你就可以编写代码了。

  1. 一个简单的方法是有两个表 - 一个用于“新数据”(您的历史表),另一个用于“当前数据”。

  2. “新数据”中的每一行都有“更改编号”、“创建日期时间”列和一个链接到“当前数据”中主键的列(外键)。如果您想使用一个表来处理多个表的历史记录,那么您还可以有一列来指示该记录是针对哪个表的。例如,如果您有不同的客户表、订单表、订单详细信息表,那么这些值将出现在列中(比如我们称之为 primary_table_name)

a) 一个全新的记录将首先进入“当前数据”表。之后,您在“新数据”表中创建一个更改编号为 0 的条目,它引用“当前数据”表中的主键。每当您看到更改编号 0 时,您就知道它指的是该对象的第一个条目(记录)。

b)后续更改将首先进入“新数据”,然后您增加更改编号计数。请注意,这将是不同的行(您不会覆盖以前的记录)。然后在保存到“新数据”后,将其复制到“当前数据”并覆盖那里的行。

从本质上讲,您的“当前数据”表将始终包含最新记录,并且是您提取数据以显示给用户的地方。如果用户随后想要查看特定记录的历史记录,您只需转到历史记录表并提取该记录的所有更改编号 > 1 的行。您可以使用单独的代码来计算记录之间的差异


推荐阅读