今天要來談談Model裡重要的功能 migrations(資料遷移)。
一般來說資料遷移指的是將APP或Models裡面資料的改變連結到資料庫裡。
它實際上是一個Python的檔案,它可以同步Models.py裡的類別以及資料庫,因此當我們更新了我們的Model時,就需要執行一次資料遷移,這樣資料庫才會是最新的版本。
根據官方文件的說明,資料遷移裡有幾個比較常見的指令:
首先我們要先打開setting.py,可以看到我們之前有添加過的'Django_app',這裡我們要做一個migrate,來讓Django幫我們生成一個apps會用到的資料庫,我們才能去進行操作。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'Django_app',
]
那怎麼生成呢?
很簡單,我們讓terminal 回到manage.py的資料夾,使用 python manage.py migrate。
(django_env) PS C:\Users\Yusin\Django_website\Django_project> python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying sessions.0001_initial... OK
大家還記得我們昨天查看setting.py的DATABASE時name的路徑,就是我們生成資料庫的路徑
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
這時候你就會看到底下跑出這些東西,告訴你已經建立完成,這時候就可以我們設定的路徑裡看到一個db.sqlite3。
這個db.sqlite3 存放著我們APP的原始資料。
當我們要嘗是打開時會看到下面的警告,這是因為他是用二進位來存我們的資料的,因此沒有辦法透過直接打開來改變我們的資料庫。
之後每次我們只要有改動Models.py裡面的資料,就必須要做一次 makemigrations 來更新我們的資料庫。
像是我們將上一次建立的Model,改成下面這樣時,就必須執行一次遷移。
from django.db import models
class Product(models.Model):
Product_name = models.CharField(max_length=30)
price = models.IntegerField(default=0)
python manage.py makemigrations
Migrations for 'Django_app':
Django_app\migrations\0001_initial.py
- Create model Product
執行完後就可以看到下面顯示 Create model Product,這樣就代表我們的資料庫有遷移完成了。
當我們完成遷移後,可以到 migrations 的資料夾找到0001_initial這個migration。
當我們 makemigrations 完成後,可以透過 sqlmigrate 來查看我們原始的SQL語法。
python manage.py sqlmigrate Django_app 0001_initial
BEGIN;
--
-- Create model Product
--
CREATE TABLE "Django_app_product" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "Product_name" varchar(30) NOT NULL, "price" integer NOT NULL);
COMMIT;
我們可以透過 showmigrations 可以看到APP底下目前的migrations。
python manage.py showmigrations Django_app
Django_app
[ ] 0001_initial
https://docs.djangoproject.com/en/4.1/topics/migrations/