每個寫過程式的人,或多或少都接觸過Git,它是一個非常好用的版本控制工具,而在Django的資料庫,其實也存在版本控制的相關指令,接下來就讓我們一起看看吧!
makemigrations
剛建好1個Django App或對models.py進行修改,都會需要執行這個指令,執行後它會自動與現行資料庫的版本比較差異,接著產生1個migrations的檔案,代表要變更的內容。對照到Git的話,就有點像是加入索引,只是這邊多產生1個migrations檔案。
範例指令
1 | python manage.py makemigrations your_app_label |
your_app_label就是App的名稱。
實際操作
-
在
members/models.py新增一個名為Members2的model
-
在
python venv輸入python manage.py makemigrations members
-
在
member/migrations下面出現1個新檔案0002_members2.py
0002_members2.py裡面放的是我們要對資料庫變更的內容 :(可以很清楚的看到要去Create
Members2這個 Model)

注意! 到這邊都還沒有實際在資料庫把資料表建起來喔!
sqlmigrate
如果對makemigrations之後,即將要執行的SQL感到好奇的話,可以藉由sqlmigrate來查看它們。
範例指令
1 | python manage.py sqlmigrate app_label migration_name |
migration_name就是0002_members2.py前面的數字,也就是0002。
實際操作
-
在
python venv輸入python manage.py sqlmigrate members 0002 -
接著就會看到將要執行的
SQL原始碼
注意! 到這邊都還沒有實際在資料庫把資料表建起來喔!
migrate
將對models的變更實際套用到資料庫上,也就是執行剛剛用sqlmigrate看到的SQL原始碼。(類似Git提交commit)
範例指令
1 | python manage.py migrate app_label |
實際操作
-
在
python venv輸入python manage.py migrate members
-
成功在資料庫建立1張新的資料表
Members2
Migrate 時光機
如果後悔了,想回到之前還沒建立資料表Members2的時候該怎麼辦?
我們只要回到Migration代號比0002還要小的0001就好囉!
要執行的指令跟剛剛很像,只是要加上Migration的代號,以這邊的例子來說就是python manage.py migrate members 0001。

這樣就成功搭乘時光機回到過去囉!
showmigrations
想要看之前幾次對資料庫的變更紀錄和App目前所在的Migration,可以透過showmigrations做查詢。
範例指令
1 | python manage.py showmigrations app_label |
實際操作
-
在
python venv輸入python manage.py showmigrations members
從上圖可以發現
members這個App的models版本目前處於代號0001這個Migration(打叉的地方)並且還有另一個未套用的Migration代號0002。
小結
看完上面4個指令,是不是覺得Django的Migrations跟Git非常像呢?
我個人覺得用過Git再接觸到Django的Migrations會有滿滿的親切感。
當然上面對於Migrations的說明只是總體的冰山一角,剩餘的內容就仰賴感興趣的人自行去細細品味囉!
在正式接續Day 09的內容前,容我再花一篇文章的時間,簡單且快速的介紹
Django Template Tags & Variables,相信對學習之後的內容會很有幫助!