一、問題描述
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