前幾天學弟跑來問我說 Django 裡的 migrations 要怎麼用?
本來想說留個筆記,下次碰到問題時可以參考,後來決定紀錄對話 (X
學弟 M:「dv ~,Django 的 migrations 要怎麼用啊?」
我:「你就想像是 database 的 version control 啊。用 python manage.py makemigrations myapp
會把更動 commit 上去。」
(幾分鐘後)
學弟 M:「可是我更改後它沒有偵測到耶」
我:「蛤 ~ ?」
我:「我之前用過可以正常偵測到啊,你的東西應該是用 inspectdb 去爬之前用的 database 生出來的吧 (我知道他要接現有的資料庫),生出來後有先 makemigrations 嗎?」
學弟 M:「有啊,還是沒偵測到。」
(我跑過去東看西看)
學弟 M:「dv,還是我開我機器的帳號給你進來看好了?」
我:「喔喔,好窩」
(我進去東試試西試試)
我:「真的沒偵測到耶,好奇怪喔 ~ 囧」
(開始 Google 各種資訊)
我:「還是它自己的問題?要升升 1.8 看嗎?反正你才剛開始寫。(隨便亂猜)」
(我開始看 Django 1.8 的 release 有沒有相關的 change)
學弟 M:「好啊,我不是用 1.8 喔」
我:「我剛剛看你是 1.7.2 啊」
學弟 M:「喔喔,我去升看看」
(幾分鐘後)
學弟 M:「我升好了~」
我:「有東西壞掉了耶 XD」
我:「看起來是底下的 db connector」
學弟 M:「真的耶,壞掉惹 Q_Q」
(Google 中)
我:「原本你用的 mysql-connector-python 現在還沒支援 Django 1.8」
我:「可以先換 PyMySQL,裝一下 ~」
學弟 M:「好,我用 pip 裝一下」
學弟 M:「裝好啦」
(我去改 settings.py 換成 django.db.backends.mysql)
我:「好啦 ~ 正常了,可以開始找剛剛的問題了 …」
(經過一些檔案開開關關和嘗試)
我:「找到問題啦,你的 models 那裡設了 manage = False
這樣他不會去偵測更動」
我:「inspectdb 出來的就設成 False 了,應該是因為你在用 inspectdb 時,代表你很有可能有另外的程式在負責管理 database,所以 Django 預設就不去做更動。」
學弟 M:「哦哦哦,真的耶,解決啦,感謝 dv ~」
我:「喔,你那邊還會有些訊息說需要 default 值的 field 沒有給 default 值,你去改改後應該就都會 work 了」
以上是在剛剛由回憶中撈取,根據修過的心理學,記憶是建構出來的,如有錯誤,我也沒辦法 XD