每個寫過程式的人,或多或少都接觸過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
,只是不建議這麼做,因為流水號本身就代表版本順序。