被數據庫延遲加載坑了一把

背景

目前做Flask開發用的數據庫框架是peewee。peewee查詢時默認是延遲加載,也就是說一個查詢語句不會立刻將所有結果返回,而是等到使用這個查詢結果時才真正從數據庫中查詢出來。在這樣一個背景下,就踩了這個坑。

過程

按照我需要處理的業務邏輯,首先要記錄用戶使用記錄,然後給用戶重置數據,最後恢復用戶的使用記錄。

1.查詢記錄保存到變量
在這業務邏輯下我想到的就是首先將用戶的使用記錄查詢出來

learn_status = sm.UserTask.select().where(sm.UserTask.learning_status.in_([1,2]), sm.UserTask.plan_id==plan_id, sm.UserTask.user_id==user_id)

2.然後給用戶重置

此處省略過程

3.從變量生成列表,恢復記錄

learn_finished_days = [item.date for item in learn_status]
sm.UserTask.update(learning_status=0, checkin_status=0).where(sm.UserTask.user_id==34113904, sm.UserTask.plan_id==2).execute()
sm.UserTaskTrain.update(is_finish=0).where(sm.UserTaskTrain.user_id==34113904, sm.UserTaskTrain.plan_id==2).execute()

當我恢復記錄時就傻眼了,發現一個記錄都沒有了,仔細一想問題就出現在peewee的延遲加載上,在第一步中查詢出記錄,此時並沒有真正將記錄賦值給變量,延遲加載機制生效了,而在第二步中又刪除了用戶所有的記錄,所以最後在第三步中使用變量寫列表生成式時,就找不到相應的記錄。

教訓是慘痛的,最後是我手動修復了那些有問題的數據。如果給我一次重來的機會,避免這個問題: 在數據庫查詢之後立刻生成列表推導式。當後面刪除真正的數據時也不會有影響。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章