在业务开发中,遇到这样一个问题
在一个线程中,批量对表Table进行修改,步骤如下:
1. 查询每条数据a;
2. 修改数据a;
3. commit提交;
4. 再查询了一遍修改后的a数据;
后来发现,在先执行过一遍上述流程后,使用navicat修改Table表a的数据,但是该批量操作中,步骤1查询到的数据a仍然是未修改过的数据
问题可以精简为如下情况:
flask shell:
#1. 查询数据
user = Users.query.filter(Users.id==1).first()
print(user.name) # 输出: 小张
# 2. 使用navicat修改id=1的数据为 小王
# 3. 重新查询数据
user = Users.query.filter(Users.id==1).first()
print(user.name) # 输出的仍然是 小张
原因: sqlalcheme中的session会缓存之前的查询结果,直至发生commit
我最开始的问题,在于将数据commit
后,重新查询了一遍数据,使得session缓存了数据,之后修改数据后重新查询时,使用的会是缓存.
解决方案: 优化查询步骤,将其放到commit之前
网友评论