Django2.0_python manage.py makemigrations与python manage.py migrate

只要模型文件models.py进行了内容的更新,我们都会使用python manage.py makemigrations 和 python manage.py migrate这两个命令。

Part1

当我们第一次在models.py文件新建model类(一个类对应数据库中的一张数据表)时,执行python manage.py makemigrations 命令之后,应用目录下的migations的文件下多了一个001的文件。
文件内容记录了我们刚才在medels.py文件的操作。
Django2.0_python manage.py makemigrations与python manage.py migrate_第1张图片
查看目录结构:
Django2.0_python manage.py makemigrations与python manage.py migrate_第2张图片
但此时看数据库里的数据表,并没有。
Django2.0_python manage.py makemigrations与python manage.py migrate_第3张图片
再执行python manage.py migrate,此时刷新数据库可以看到新建好的数据表,数据表中字段也出现了
Django2.0_python manage.py makemigrations与python manage.py migrate_第4张图片Django2.0_python manage.py makemigrations与python manage.py migrate_第5张图片

综上:python manage.py makemigrations命令记录对models文件的修改。python manage.py migrate命令在数据库中创建表和数据

Part2

问题:

对已有的models.py文件进行了一些修改,需要重新迁移数据该怎么使用命令?
Django2.0_python manage.py makemigrations与python manage.py migrate_第6张图片
方法:修改部分较小时,修改models文件后,重新执行命令python manage.py makemigrations、python manage.py migrate。
Django2.0_python manage.py makemigrations与python manage.py migrate_第7张图片Django2.0_python manage.py makemigrations与python manage.py migrate_第8张图片

注意:有时必须要删除001文件,因为Django会将你所有的操作放在这个0001文件中。你即使删除了数据库中的表,但是这个文件中记录你已经创建了表,所以在执行python manage.py migrate会提示“No migrations to apply”

问题:

两个命令的关系?可以只执行其中一个命令吗?

答案:首先,第一个命令的作用是记录即将要做的数据库操作,但实际上并没有进行数据库操作。第二个的命令的作用是对数据库进行操作(建表、改表等)。目前来说,第二个命令是必须要执行的,第一个命令需不需要必须执行,有待验证。
验证结果如下:
直接执行python manage.py migrate,结果报错:“ Your models have changes that are not yet reflected in a migration”
Django2.0_python manage.py makemigrations与python manage.py migrate_第9张图片
两个命令一起执行结果,映射成功:
Django2.0_python manage.py makemigrations与python manage.py migrate_第10张图片

part3

执行python manage.py migrate之后,可以使用python manage.py sqlmigrate appname migrations_num(例如python manage.py sqlmigrate user 0002)查看当前migrations文件对应的sql语句。

多个APP情况精确迁移:

python manage.py makemigrations appname  //对某个app进行迁移记录
python manage.py migrate appname  
python manage.py migrate appname 文件名  //只迁移某一个文件

你可能感兴趣的:(Django,django,数据库)