iT邦幫忙

2022 iThome 鐵人賽

DAY 11
0
Modern Web

Django 初心者之旅系列 第 11

【Day 11】Django Models 番外篇(2) – Migrations

  • 分享至 

  • xImage
  •  

每個寫過程式的人,或多或少都接觸過Git,它是一個非常好用的版本控制工具,而在Django的資料庫,其實也存在版本控制的相關指令,接下來就讓我們一起看看吧!

makemigrations

剛建好1個Django App或對models.py進行修改,都會需要執行這個指令,執行後它會自動與現行資料庫的版本比較差異,接著產生1個migrations的檔案,代表要變更的內容。對照到Git的話,就有點像是加入索引,只是這邊多產生1個migrations檔案。

範例指令

python manage.py makemigrations your_app_label

your_app_label就是App的名稱。

實際操作

  1. members/models.py新增一個名為Members2model

  2. python venv輸入python manage.py makemigrations members

  3. member/migrations下面出現1個新檔案0002_members2.py

    0002_members2.py裡面放的是我們要對資料庫變更的內容 :

    (可以很清楚的看到要去Create Members2 這個 Model)

注意! 到這邊都還沒有實際在資料庫把資料表建起來喔!

sqlmigrate

如果對makemigrations之後,即將要執行的SQL感到好奇的話,可以藉由sqlmigrate來查看它們。

範例指令

python manage.py sqlmigrate app_label migration_name

migration_name就是0002_members2.py前面的數字,也就是0002

實際操作

  1. python venv輸入python manage.py sqlmigrate members 0002

  2. 接著就會看到將要執行的SQL原始碼

注意! 到這邊都還沒有實際在資料庫把資料表建起來喔!

migrate

將對models的變更實際套用到資料庫上,也就是執行剛剛用sqlmigrate看到的SQL原始碼。(類似Git提交commit)

範例指令

python manage.py migrate app_label

實際操作

  1. python venv輸入python manage.py migrate members

  2. 成功在資料庫建立1張新的資料表Members2

Migrate 時光機

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

這樣就成功搭乘時光機回到過去囉!

showmigrations

想要看之前幾次對資料庫的變更紀錄和App目前所在的Migration,可以透過showmigrations做查詢。

範例指令

python manage.py showmigrations app_label

實際操作

  1. python venv輸入python manage.py showmigrations members

    從上圖可以發現members這個App的models版本目前處於代號0001這個Migration(打叉的地方)並且還有另一個未套用的Migration代號0002

小結

看完上面4個指令,是不是覺得DjangoMigrationsGit非常像呢?
我個人覺得用過Git再接觸到DjangoMigrations會有滿滿的親切感。
當然上面對於Migrations的說明只是總體的冰山一角,剩餘的內容就仰賴感興趣的人自行去細細品味囉!

在正式接續Day 09的內容前,容我再花一篇文章的時間,簡單且快速的介紹Django Template Tags & Variables,相信對學習之後的內容會很有幫助!


上一篇
【Day 10】Django Models 番外篇(1) – ORM
下一篇
【Day 12】 Django Template Tags & Variables
系列文
Django 初心者之旅31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
rtfgvb74125
iT邦新手 4 級 ‧ 2022-11-17 13:34:42

您好請問是我每次更新model都必須要新增一個新的migrations檔案嗎?
然後migrations檔案的0001跟0002是自行產生的流水號,如果自行更改的話會出錯嗎

Xiang1009 iT邦研究生 4 級 ‧ 2022-11-18 04:15:47 檢舉

每次修改models.py都會需要執行makemigrationsmigrate,分別去產生新的migrations檔案並實際建立資料表。自動產生的流水號是可以自行修改檔案名稱,像是將0002_members2.py更改為0003_members2.py,只是不建議這麼做,因為流水號本身就代表版本順序。

我要留言

立即登入留言