一、问题描述
Flask+SQLAlchemy的注册登录小程序,注册成功后通过Navicat可看到MySQL中新值已经添加成功,但登录时却显示账号不存在,即查询不到刚刚插入的值。
查询操作代码
#创建DEBession类型
DBSession = sessionmaker(bind=engine)
db_session = DBSession()
#查询表中用户是否存在
def get_info(name):
user = db_session.query(User).filter(User.name == name).all()
return user[0] if user else False
二、问题分析
经过查询资料发现,SQLAlchemy为了加快查速度,因而存在"缓存"机制。在其执行查询操作时,若存在有缓存(上一次数据库该表的值),则其会优先查询缓存中的值并返回结果,而缓存是上一次操作时所保留的,当然还没有写入刚插入的新值。
所以这也就出现了数据库的值已经更新,但却查询不到更新值的情况。
三、解决途径
在查询操作前先执行db_session.commit()
这样会将当前session对象里面的缓存全部提交,即清空缓存。在下一次进行查询时,就不会查询缓存,而会从数据库中查询最新的数据。
#查询表中用户是否存在
def get_info(name):
#清空缓存
db_session.commit()
user = db_session.query(User).filter(User.name == name).all()
return user[0] if user else False