Flask 數(shù)據(jù)庫(kù)遷移與部署的一些經(jīng)驗(yàn)

此文為本人原創(chuàng)拉一,最早發(fā)布于flask開(kāi)發(fā)的第五章關(guān)于創(chuàng)建遷移腳本的問(wèn)題(已解決) - cocode.cc。內(nèi)容并不完善旧乞,持續(xù)更新蔚润,可隨意轉(zhuǎn)載。轉(zhuǎn)載請(qǐng)標(biāo)明出處尺栖。

分享一點(diǎn)經(jīng)驗(yàn)嫡纠,主要是自己的理解,希望能有所幫助。千辛萬(wàn)苦部署好的數(shù)據(jù)庫(kù)除盏,就不為了答題一一驗(yàn)證了叉橱,全憑記憶回答,有不對(duì)的地方歡迎指出者蠕,會(huì)及時(shí)修改窃祝。

以下內(nèi)容以執(zhí)行文件名為manage.py舉例,請(qǐng)自行調(diào)整踱侣。

  1. 影響 migrate 的是數(shù)據(jù)庫(kù)的結(jié)構(gòu)粪小。

    • 比方說(shuō)你的 User 類中添加了一個(gè) Column - nickname ,那么在保存 Model 之后建議執(zhí)行 python manage.py db migrate -m "add nickname抡句;
    • 而給 table 加入了新的方法探膊,例如 def change_nick_name() ,是不需要 migrate 的玉转。如果 migrate 突想,結(jié)果也是 No change
    • 這一點(diǎn)可以留意一下究抓,比較保險(xiǎn)的辦法是覺(jué)得有必要的時(shí)候就嘗試一下 migrate猾担,反正 No changes 對(duì)你的遷移也沒(méi)有影響。
  2. 在創(chuàng)建本地?cái)?shù)據(jù)庫(kù)的時(shí)候刺下,不要在 py shell 環(huán)境下執(zhí)行 db.create_all()

    • 請(qǐng)使用python manage.py db init, python manage.py db upgrade 來(lái)創(chuàng)建本地?cái)?shù)據(jù)庫(kù)绑嘹。
    • 通常我會(huì)模仿書(shū)本上在上面兩條指令之間再做一次migrate,但經(jīng)驗(yàn)告訴我橘茉,結(jié)果好像都是No changes工腋,畢竟,我init之后沒(méi)有做過(guò)調(diào)整啊畅卓。
    • init指令會(huì)根據(jù)Model.py中的結(jié)構(gòu)創(chuàng)建遷移文件夾migrations擅腰,而upgrade會(huì)根據(jù)migrations下的內(nèi)容,通過(guò)config.py在找到正確的位置翁潘,并創(chuàng)建SQL趁冈,并在SQL中創(chuàng)建一個(gè)名為versions的table來(lái)存放和遷移文件夾中相同的版本號(hào)。(重要
    • 在開(kāi)始的嘗試中拜马,特別是往heroku上部署的過(guò)程中渗勘,經(jīng)常會(huì)遇到許多數(shù)據(jù)庫(kù)的坑,如果實(shí)在走投無(wú)路俩莽,又確定是數(shù)據(jù)庫(kù)遷移問(wèn)題旺坠,并且無(wú)法優(yōu)雅地解決。你需要做的就是以下幾步:
      (1). 休息一下扮超,我知道你很累了
      (2). 執(zhí)行python manage.py db shell取刃,在py shell環(huán)境下執(zhí)行drop_all()蹋肮;或者直接刪了你的原有數(shù)據(jù)庫(kù)。
      (3). 按照本段前面的提示重新創(chuàng)建本地SQL
      (4). drop_all()或者刪除并重新指定遠(yuǎn)端數(shù)據(jù)庫(kù)
      (5). 執(zhí)行heroku run python manage.py db deploy(假設(shè)你部署在heroku上璧疗,并已經(jīng)完成了deploy的定義)
      (6). 現(xiàn)在你的遠(yuǎn)端和本地?cái)?shù)據(jù)庫(kù)的版本是相同的了括尸。
  3. 如果本地使用sqlite作為數(shù)據(jù)庫(kù),千萬(wàn)不要從model.py中刪除column病毡!

    • 這一點(diǎn)非常重要,因?yàn)楦鶕?jù)我查到到資料顯示屁柏,sqlite是沒(méi)有“刪除行”這一個(gè)選項(xiàng)的啦膜。如果你刪除了某個(gè)column,這一操作能被migrate正確記錄淌喻,但是在你upgrade的時(shí)候就會(huì)報(bào)錯(cuò)僧家。然后想要還原migrate版本?抱歉裸删,我不會(huì)……(歡迎朋友們指導(dǎo)一下八拱,謝謝!)
  4. 部署到遠(yuǎn)端時(shí)涯塔,請(qǐng)確認(rèn)你又versions文件夾

    • 我不確定init會(huì)不會(huì)有肌稻,在執(zhí)行migrate指令時(shí),會(huì)更新versions文件夾
    • 如果沒(méi)有versions文件夾匕荸,遠(yuǎn)端部署的時(shí)候也會(huì)報(bào)錯(cuò)爹谭,請(qǐng)務(wù)必留意。
  5. 理解每個(gè)遷移指令的含義

    • init的作用是初始化遷移榛搔,創(chuàng)建migration文件夾
    • migrate的作用是根據(jù)model.py中的變化更新遷移诺凡,該指令會(huì)在migration/versions/文件夾中新增一個(gè)版本文件,文件名為版本號(hào)践惑。打開(kāi)能夠看到對(duì)應(yīng)model.py文件腹泌,修改前后新遷移版本發(fā)生的變化。
    • update會(huì)將遷移中最新版本的結(jié)構(gòu)應(yīng)用到數(shù)據(jù)庫(kù)中(例如添加新增的列)尔觉,并更新自動(dòng)創(chuàng)建的version 表中的版本號(hào)凉袱。該版本號(hào)與migration/versions/文件夾中對(duì)應(yīng)。任何情況下穷娱,這兩個(gè)版本號(hào)不對(duì)應(yīng)都會(huì)導(dǎo)致出錯(cuò)绑蔫。

我的帖子與回答都會(huì)持續(xù)更新。如果您覺(jué)得有幫助泵额,煩請(qǐng)點(diǎn)個(gè)贊配深,這樣或許能幫到其它朋友。

如果我有誤導(dǎo)他人的地方嫁盲,請(qǐng)與我聯(lián)系篓叶,我會(huì)及時(shí)修改烈掠。謝謝!

如果有需要的朋友缸托,可以看看我的website左敌,希望對(duì)大家有所幫助。

關(guān)于網(wǎng)頁(yè)中已有的功能都可以和我交流俐镐,歡迎查找bug矫限,交流心得。謝謝佩抹!

jtr-todo.herokuapp.com

(網(wǎng)站處于測(cè)試階段叼风,請(qǐng)勿保存重要信息,數(shù)據(jù)丟失概不負(fù)責(zé)棍苹,還請(qǐng)見(jiàn)諒无宿。)

辭職學(xué)習(xí)中,有工作機(jī)會(huì)歡迎與我聯(lián)系枢里,謝謝孽鸡!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市栏豺,隨后出現(xiàn)的幾起案子彬碱,更是在濱河造成了極大的恐慌,老刑警劉巖冰悠,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堡妒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡溉卓,警方通過(guò)查閱死者的電腦和手機(jī)皮迟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)桑寨,“玉大人伏尼,你說(shuō)我怎么就攤上這事∥疚玻” “怎么了爆阶?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)沙咏。 經(jīng)常有香客問(wèn)我辨图,道長(zhǎng),這世上最難降的妖魔是什么肢藐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任故河,我火速辦了婚禮,結(jié)果婚禮上吆豹,老公的妹妹穿的比我還像新娘鱼的。我一直安慰自己理盆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布凑阶。 她就那樣靜靜地躺著猿规,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宙橱。 梳的紋絲不亂的頭發(fā)上姨俩,一...
    開(kāi)封第一講書(shū)人閱讀 51,245評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音师郑,去河邊找鬼哼勇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛呕乎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播陨晶,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼猬仁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了先誉?” 一聲冷哼從身側(cè)響起湿刽,我...
    開(kāi)封第一講書(shū)人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎褐耳,沒(méi)想到半個(gè)月后诈闺,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铃芦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年雅镊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刃滓。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡仁烹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出咧虎,到底是詐尸還是另有隱情卓缰,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布砰诵,位于F島的核電站征唬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏茁彭。R本人自食惡果不足惜总寒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尉间。 院中可真熱鬧偿乖,春花似錦击罪、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至画切,卻和暖如春竣稽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背霍弹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工毫别, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人典格。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓岛宦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親耍缴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子砾肺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容