flask-sqlalchemy 使用db.session.add_all 提交的部分数据字段内容为空

0 评论
/ /
644 阅读
/
1794 字
26 2023-05

项目需要监控所有服务的响应时间,记录在postgresql数据库中,由于监控请求每分钟有一次,服务比较多,一天下来有十多万条数据,所以先临时把数据存放在redis中,第二天固定时间获取所有的数据,然后分别提交到正式和staging两个环境对应的数据库中。

获取到数据的时候,需要对服务的命名进行匹配和替换,所以定义了一个字典进行映射。

刚开始时这样做的

production_ins_list = []
    for production_res in production_result_list:
        ping_time = production_res.get("ping_time").split(" ")[0]
        production_pings = ProductionPings()
        production_pings.ping_url = production_res.get("ping_url")
        production_pings.ping_time = ping_time
        production_pings.time_unit = production_res.get("time_unit")
        production_pings.service = production_res.get("service")
        production_pings.create_time = datetime.datetime.now()
        production_ins_list.append(production_pings)
    db.session.add_all(production_ins_list)
    db.session.commit()                

当查看提交的数据的时候,发现所大部分的service字段的内容为空。

罗列了所有的可能:

1、保存到redis中时候内容为空

2、从映射字典获取对应的名称的时候为空

3、保存到数据库的时候出现了问题

然后逐个排除,发现只可能在保存到数据库的时候出现问题,然后修改db.session.add_all 为db.session.add问题得到解决

production_ins_list = []
    for production_res in production_result_list:
        ping_time = production_res.get("ping_time").split(" ")[0]
        production_pings = ProductionPings()
        production_pings.ping_url = production_res.get("ping_url")
        production_pings.ping_time = ping_time
        production_pings.time_unit = production_res.get("time_unit")
        production_pings.service = production_res.get("service")
        production_pings.create_time = datetime.datetime.now()
        production_ins_list.append(production_pings)
        db.session.add(production_pings)
    db.session.commit()      

为什么会出现这样的问题,等有空了研究下,再做补充