你們好,我是言淦,我今天帶來的文章是《Django2-migrate數據遷移》,但願能給大家帶來幫助!python
環境: Django 2.2.1 + Python 3.6.7sql
當咱們用到Dj的時候,ORM框架是繞不過的一個點,而ORM最重要的點就是將數據庫表映射爲一個類(表Model),也能夠經過類直接生成咱們要的數據庫表。shell
在寫數據表Model的時候,通常有如下兩種狀況:數據庫
對於第一種狀況,只須要在settings.py等文件配置好數據庫信息,便可經過該model操做數據庫表,不須要執行其餘命令。django
對於第二種狀況,則是今天的主題,涉及到的命令有makemigrations、migrate,sqlmigrate。bash
可參考個人另外一篇文章!《Django1-配置MySQL數據庫》框架
from django.db import models
class StuGrade(models.Model):
stu_id = models.IntegerField(primary_key=True)
chinese = models.IntegerField()
math = models.IntegerField()
en = models.IntegerField()
class Meta:
db_table = 'stu_grade'
# 新增的
class StuInfo(models.Model):
stu_id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=200)
sex = models.SmallIntegerField()
age = models.SmallIntegerField()
class Meta:
db_table = 'stu_info'
複製代碼
$ python manage.py makemigrations sqltestpost
makemigrations的做用是生成「數據庫遷移文件」,「遷移「是 Django 對於模型定義(也就是你的數據庫結構)的變化的儲存形式。經過這份文件咱們能夠知道咱們的Model會生成怎樣的數據表,生成的遷移文件在migrations文件下, 注意這個命令並不會生成表,它只是告知你它會怎麼生成表。測試
這裏的sqltest指的是我建立的應用名。spa
$ python manage.py sqlmigrate sqltest
這個命令是經過SQL語句的方式告知你它是怎麼建立表的,這個命令也不會生成表
$ python manage.py sqlmigrate sqltest 0001
BEGIN;
--
-- Create model StuGrade
--
CREATE TABLE `stu_grade` (`stu_id` integer NOT NULL PRIMARY KEY, `chinese` integer NOT NULL, `math` integer NOT NULL, `en` integer NOT NULL);
--
-- Create model StuInfo
--
CREATE TABLE `stu_info` (`stu_id` integer NOT NULL PRIMARY KEY, `name` varchar(255) NOT NULL, `sex` smallint NOT NULL, `age` smallint NOT NULL);
COMMIT;
複製代碼
$ python manage.py migrate sqltest
這個命令會在數據庫中建立表,建立的SQL語句就是上文所看到的。
指定某一次遷移: $ python manage.py migrate sqltest 0001
查看migrate的詳細信息 $ python manage.py migrate --help
咱們的數據表的字段確定不是一成不變的,因此咱們會遇到修改Model的狀況,這時的操做以下:
其中,每修改一次Model,咱們都要進行一次「遷移」,每次遷移的時候都會生成一份遷移文件,遷移文件前面的序號是不斷遞增的。
第一次「遷移」的時候會在數據庫建立一個django_migrations的表,這個表會記錄你每次遷移的狀況, 因此當你想從新生成全部新的表時,這張表對應的內容也要刪除。
最後,遷移文件對咱們來講很是重要,建議作好版本控制。