每個寫過程式的人,或多或少都接觸過Git,它是一個非常好用的版本控制工具,而在Django的資料庫,其實也存在版本控制的相關指令,接下來就讓我們一起看看吧!
剛建好1個Django App或對models.py進行修改,都會需要執行這個指令,執行後它會自動與現行資料庫的版本比較差異,接著產生1個migrations的檔案,代表要變更的內容。對照到Git的話,就有點像是加入索引,只是這邊多產生1個migrations檔案。
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)
注意! 到這邊都還沒有實際在資料庫把資料表建起來喔!
如果對makemigrations之後,即將要執行的SQL感到好奇的話,可以藉由sqlmigrate來查看它們。
python manage.py sqlmigrate app_label migration_name
migration_name就是0002_members2.py前面的數字,也就是0002。
在python venv輸入python manage.py sqlmigrate members 0002
接著就會看到將要執行的SQL原始碼

注意! 到這邊都還沒有實際在資料庫把資料表建起來喔!
將對models的變更實際套用到資料庫上,也就是執行剛剛用sqlmigrate看到的SQL原始碼。(類似Git提交commit)
python manage.py migrate app_label
在python venv輸入python manage.py migrate members

成功在資料庫建立1張新的資料表Members2
如果後悔了,想回到之前還沒建立資料表Members2的時候該怎麼辦?
我們只要回到Migration代號比0002還要小的0001就好囉!
要執行的指令跟剛剛很像,只是要加上Migration的代號,以這邊的例子來說就是python manage.py migrate members 0001。

這樣就成功搭乘時光機回到過去囉!
想要看之前幾次對資料庫的變更紀錄和App目前所在的Migration,可以透過showmigrations做查詢。
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,相信對學習之後的內容會很有幫助!
您好請問是我每次更新model都必須要新增一個新的migrations檔案嗎?
然後migrations檔案的0001跟0002是自行產生的流水號,如果自行更改的話會出錯嗎
每次修改models.py都會需要執行makemigrations和migrate,分別去產生新的migrations檔案並實際建立資料表。自動產生的流水號是可以自行修改檔案名稱,像是將0002_members2.py更改為0003_members2.py,只是不建議這麼做,因為流水號本身就代表版本順序。