此文為本人原創(chuàng),最早發(fā)布于求助《Flask Web 開發(fā)》第五章關于數(shù)據(jù)庫db.session.add()和db.session.commit()問題幽七。內(nèi)容并不完善溅呢,持續(xù)更新,可隨意轉載咐旧。轉載請標明出處。
問題簡述:
當加入
SQLALCHEMY_ON_TEARDOWN=True
铣墨,在什么情況下仍然要執(zhí)行db.session.commit()
解答整理如下:
config
是在app/__init__.py
中調用的室埋,所以執(zhí)行model.py
中的方法時,SQLALCHEMY_COMMIT_ON_TEARDOWN = True
已經(jīng)生效了伊约。即請求結束后自動commit姚淆。
后面幾個章節(jié)中出現(xiàn)db.session.commit()
的主要作用都是為了生成id來使用。
你可以結合源碼看一下屡律。
session的原理就請參考Flask 源碼閱讀筆記腌逢。
SQLALCHEMY_ON_TEARDOWN
在flask-sqlalchemy 2.0之后已經(jīng)被刪除了,需要用SQLALCHEMY_TRACK_MODIFICATIONS
替代超埋,想必你運行的時候應該看到過相關提示搏讶。
這個新熟悉我還沒掌握,抽空看下documentation再來分析纳本。也希望需要幫助的同學參考一下 fondoger 同學的評論
繼續(xù)回到SQLALCHEMY_ON_TEARDOWN
窍蓝。按照書上的說法:
將其設為True時,每次請求結束后都會自動提交數(shù)據(jù)庫中的變動吓笙。
因為v1.0的如果這里的documentation已經(jīng)找不到了,沒有依據(jù)巾腕,我就在這推測一下:
只有當請求結束的時候,才會自動commit
叁鉴,而直接操作數(shù)據(jù)庫是不行的,需要手動commit
佛寿。
回到model.py中看但壮,insert_roles()
被@staticmethod
包裝,是一個靜態(tài)方法常侣,它執(zhí)行的位置是在python manage.py shell
中蜡饵,而非請求中,所以需要手動commit
胳施。
你可以驗證一下溯祸,方法也很簡單,保證寫入SQLALCHEMY_ON_TEARDONW=True
后舞肆,在shell中嘗試:
>>> user = User(username='test')
>>> db.session.add(user)
>>> quit()
再次進入shell焦辅,查找<User u'test'>
,不存在椿胯,即推斷合理:shell中執(zhí)行的用于操作數(shù)據(jù)庫的方法還是要加commit
筷登。
我的帖子與回答都會持續(xù)更新。如果您覺得有幫助哩盲,煩請點個贊仆抵,這樣或許能幫到其它朋友。
如果我有誤導他人的地方种冬,請與我聯(lián)系,我會及時修改舔糖。謝謝娱两!
如果有需要的朋友金吗,可以看看我的website旱物,希望對大家有所幫助。
關于網(wǎng)頁中已有的功能都可以和我交流宝穗,歡迎查找bug,交流心得须鼎。謝謝!
(網(wǎng)站處于測試階段糖荒,請勿保存重要信息蜘矢,數(shù)據(jù)丟失概不負責,還請見諒舞吭。)
辭職學習中,有工作機會歡迎與我聯(lián)系惧浴,謝謝!