你们好,我是言淦,我今天带来的文章是《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的表,这个表会记录你每次迁移的状况, 因此当你想从新生成全部新的表时,这张表对应的内容也要删除。
最后,迁移文件对咱们来讲很是重要,建议作好版本控制。