iT邦幫忙

2022 iThome 鐵人賽

DAY 20
0

前言

今天要來談談Model裡重要的功能 migrations(資料遷移)。

migrations 資料遷移

一般來說資料遷移指的是將APP或Models裡面資料的改變連結到資料庫裡。
它實際上是一個Python的檔案,它可以同步Models.py裡的類別以及資料庫,因此當我們更新了我們的Model時,就需要執行一次資料遷移,這樣資料庫才會是最新的版本。
根據官方文件的說明,資料遷移裡有幾個比較常見的指令:

  • migrate : 負責資料庫的應用和撤銷。如:建立新的資料庫和將資料庫還原到上一個版本。
  • makemigrations : 當Models有更動時,需要使用它來將資料庫和Model進行同步。
  • sqlmigrate : 可以呈現我們遷移的SQL原始語法。
  • showmigrations: 可以列出我們目前遷移的項目以及它的狀態。

migrate

首先我們要先打開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的原始資料。

https://ithelp.ithome.com.tw/upload/images/20220928/20150927NBd4HW3DDt.png

當我們要嘗是打開時會看到下面的警告,這是因為他是用二進位來存我們的資料的,因此沒有辦法透過直接打開來改變我們的資料庫。

https://ithelp.ithome.com.tw/upload/images/20220928/20150927llHHxGgzFw.png

makemigrations

之後每次我們只要有改動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。

https://ithelp.ithome.com.tw/upload/images/20220928/20150927WW8oJqehS0.png

sqlmigrate

當我們 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

我們可以透過 showmigrations 可以看到APP底下目前的migrations。

python manage.py showmigrations Django_app
Django_app
 [ ] 0001_initial

參考資料&推薦閱讀

https://docs.djangoproject.com/en/4.1/topics/migrations/


上一篇
Day-19 - Model是啥米
下一篇
Day-21 Models- 使用Shell創建和插入資料
系列文
從0 到 50 初探 如何使用Django 架構出一個網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言