Django 模型遷移與資料庫同步完整指南
更新日期: 2024 年 11 月 24 日
本文為 Django 進階教學,第 4 篇:
- 理解 Django 中的相對路徑與絕對路徑
- Django URL 路徑設置|name 參數與命名空間(Namespace)
- Django 串接資料庫與模型建構:完整入門指南
- Django 模型遷移與資料庫同步完整指南 👈 所在位置
- 使用 Django ORM 將資料寫入資料庫:新手入門指南
- Django 實現 CRUD 的 C(Create):新增資料功能完整指南
- Django CRUD 的 R(Read):資料讀取與顯示功能指南
- Django CRUD 的 U(Update):資料更新功能完整指南
- Django CRUD 的 D(Delete):資料刪除功能完整指南
建議閱讀本文前,先閱讀完 Django 新手教學 系列文
在 Django 開發中,模型(Model)是定義數據結構的核心部分,而遷移(Migration)則負責將這些結構同步到資料庫中。
然而,遷移並非直接建立資料庫,而是生成一系列描述模型變更的檔案,透過這些檔案進行同步操作。
本篇文章將詳細介紹 Django 模型與資料庫同步的完整流程,並解答常見的誤解與疑問。
模型到資料庫的完整流程
Django 的模型與資料庫同步過程可以分為以下三步:
- 模型(Model)
在應用的models.py
文件中定義數據結構,例如資料表的欄位、類型與屬性。 - 遷移(Migration)
Django 會檢查所有應用中的模型,判斷是否有新增、修改或刪除,並根據變更生成遷移檔案,作為資料庫操作的指令描述。 - 資料庫(Database)
遷移檔案被應用到資料庫後,資料表會根據描述檔案創建或更新。
常見誤解
- 遷移 ≠ 資料庫建立
遷移(Migration)並不是直接建立資料庫,而是生成描述檔案,用於告訴資料庫應該如何更新結構。- 資料庫的建立 是透過資料庫系統本身進行的(如 SQLite、PostgreSQL)。
- 遷移檔案 是操作資料庫的中介,幫助將模型與資料表同步。
流程示意圖
Model ----[makemigrations]----> Migration 描述檔 ----[migrate]----> 資料庫
生成遷移檔案與檔案位置
使用 makemigrations
指令
每次對模型進行修改後,我們需要執行以下指令,生成描述模型變更的遷移檔案:
python manage.py makemigrations
遷移檔案的位置
Django 會在應用的 migrations/
資料夾中生成新的遷移檔案。
以下是完整的目錄結構:
mysite/
├── manage.py
├── mysite/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│
├── resumes/
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── models.py # 定義模型
│ ├── migrations/ # 存放遷移檔案
│ │ ├── __init__.py
│ │ ├── 0001_initial.py # 初始遷移檔案
│
├── db.sqlite3 # 預設的 SQLite 資料庫
遷移檔案的作用
- 記錄模型變更:每個遷移檔案都記錄模型的新增、修改或刪除,這些記錄會被用於生成對應的 SQL 語法。
- 自動生成 SQL 語法:遷移檔案幫助開發者省略手動書寫 SQL 的繁瑣過程,Django 會根據描述自動生成並執行正確的 SQL 語法。
遷移檔案的詳細作用
檢查與生成描述檔
當執行 makemigrations
時,Django 會掃描專案中所有應用的模型:
- 比較目前的模型定義與上一次遷移檔案的狀態。
- 判斷模型是否有新增、刪除或修改。
- 針對變更生成對應的遷移檔案。
例如:
- 新增模型會生成
CreateModel
的操作。 - 修改欄位會生成
AlterField
的操作。
遷移檔案範例
以下是遷移檔案 0001_initial.py
的內容:
class Migration(migrations.Migration):
initial = True
dependencies = []
operations = [
migrations.CreateModel(
name='Resume',
fields=[
('id', models.BigAutoField(primary_key=True)), # 自動生成的 ID
('title', models.CharField(max_length=50)),
('skill', models.CharField(max_length=50, null=True)),
('content', models.TextField(null=True)),
],
),
]
遷移檔案的每次變更都會被納入版本控制(如 Git),方便團隊成員同步資料庫結構,並保證版本一致性。
應用遷移到資料庫
在生成遷移檔案後,我們需要使用以下指令,將描述檔案應用到資料庫:
python manage.py migrate
指令的作用
- Django 會根據遷移檔案生成 SQL 語法,並執行這些指令來創建或更新資料表。
- 每個遷移都會記錄到一張名為
django_migrations
的表中,用於追蹤哪些遷移已經執行。
資料庫檢視與工具
遷移完成後,Django 的預設資料庫 db.sqlite3
會被更新,並包含所有的資料表與結構。
如何檢視資料庫?
SQLite 是 Django 的預設資料庫,需使用專門的工具進行檢視,例如:
- SQLite Viewer:瀏覽器插件或線上工具。
- DB Browser for SQLite:桌面應用程序,用於操作 SQLite 資料庫。
為什麼 db.sqlite3
無法直接在 VS Code 中打開?
SQLite 文件是二進制格式,無法用普通文本編輯器查看。
雖然 VS Code 支援多種插件(如 SQLite 插件),但需要安裝相應擴展才能檢視和操作。
遷移的版本控制與常見指令
Django 支援遷移的版本控制,方便回退到特定的結構或檢視遷移狀態。
常見指令
- 顯示遷移狀態
python manage.py showmigrations
此指令會列出所有應用的遷移檔案,以及它們的執行情況。 - 回退到特定版本 若需回退到某個遷移版本,可執行以下指令:
python manage.py migrate <app_name> <migration_name>
例如:
python manage.py migrate resumes 0001_initial
- 清空遷移記錄(僅限開發環境) 若需重新生成遷移檔案,可刪除
migrations/
資料夾,並執行以下指令:
python manage.py makemigrations python manage.py migrate
小結
Django 的遷移工具幫助開發者高效管理資料庫結構,其特點包括:
- 模型與資料庫同步:透過
makemigrations
和migrate
,自動將模型變更應用到資料庫。 - 自動生成 SQL 語法:減少手動操作,提高開發效率。
- 版本控制:每次變更都有記錄,方便團隊協作與追蹤。
工作流程
- 修改或新增模型。
- 執行
python manage.py makemigrations
生成描述檔。 - 執行
python manage.py migrate
將描述檔應用到資料庫。 - 使用工具檢視資料庫結構與內容。
Django 的遷移系統不僅提高了開發效率,還大大降低了管理資料庫結構的複雜度,是 Web 開發中的一項重要工具。