Django2.0-db(11)-ORM模型迁移
2018-11-11 12:01
363 查看
笔记在知了课堂-Django开发的基础上更改
ORM模型迁移
迁移命令:
-
makemigrations
:将模型生成迁移脚本。模型所在的app
,必须放在settings.py
中的INSTALLED_APPS
中。这个命令有以下几个常用选项:[app_label]
:后面可以跟一个或者多个app
,那么就只会针对这几个app生成迁移脚本。如果没有任何的app_label,那么会检查INSTALLED_APPS
中所有的app下的模型,针对每一个app都生成响应的迁移脚本。 [--name]
:给这个迁移脚本指定一个名字(就是在migrations
文件夹里的名字)[ --empty]
:生成一个空的迁移脚本。如果你想写自己的迁移脚本,可以使用这个命令来实现一个空的文件,然后自己再在文件中写迁移脚本。-
migrate
:将新生成的迁移脚本。映射到数据库中。创建新的表或者修改表的结构。Django会生成一个记录migrationname文件的依赖表(django_migrations
)),在执行migrate的时候会根据该表和文件依赖关系进行迁移(表里有的不会再生成)以下一些常用的选项:
[app_label]
:将某个app
下的迁移脚本映射到数据库中。如果没有指定,那么会将所有在INSTALLED_APPS
中的app
下的模型都映射到数据库中。 app_label migrationname
:将某个app
下指定名字的migration
文件映射到数据库中。[--fake]
:可以将指定的迁移脚本名字添加到数据库中。但是并不会把迁移脚本转换为SQL语句,修改数据库中的表。[--fake-initial]
:将第一次生成的迁移文件版本号记录在数据库中。但并不会真正的执行迁移脚本。-
showmigrations
:查看某个app下的迁移文件。如果后面没有app,那么将查看INSTALLED_APPS
中所有的迁移文件。 -
sqlmigrate
:查看某个迁移文件在映射到数据库中的时候,转换的SQL
语句。
migrate怎么判断哪些迁移脚本需要执行
会将代码种的迁移脚本和数据库中
django_migrations中的迁移脚进行对比,如果发现数据库中没有这个迁移脚本(
django_migrations表),那么就会执行这个迁移脚本。
migrate做了什么
- 将相关的迁移脚本翻译成sql语句,在数据库中执行这个sql语句
- 如果这个sql语句执行没有问题,那么就会将这个迁移脚本的名字记录到
django_migrations
中
migrations中的迁移版本和数据库中的迁移版本对不上怎么办?
- 找到哪里不一致,然后使用
python manage.py --fake [版本名字]
,将这个版本标记为已经映射。 - 删除指定
app
下migrations
和数据库表django_migrations
中和这个app
相关的版本号,然后将模型中的字段和数据库中的字段保持一致,再使用命令python manage.py makemigrations
重新生成一个初始化的迁移脚本,之后再使用命令python manage.py makemigrations --fake-initial
来将这个初始化的迁移脚本标记为已经映射。以后再修改就没有问题了。
更多关于迁移脚本的。请查看官方文档:https://docs.djangoproject.com/en/2.0/topics/migrations/
另外一个笔记版本
原因
执行migrate命令会报错的原因是:数据库中的
django_migrations表中的迁移版本记录和代码种的迁移脚本不一致导致的。
解决方法
使用[--fake]
参数
首先对比数据库中的迁移脚本和代码中的迁移脚本。然后找到哪个不同,之后再使用
--fake,将代码种的迁移脚本信息添加到
django_migrations表中,但是不会执行sql语句。这样就可以避免每次执行
migrate的时候,都执行一些重复的迁移脚本。
最后解决方案
如果代码中的迁移脚本和数据库中的迁移脚本实在太多,无法搞清楚使用。
- 原理: 将之前的哪些迁移脚本剔除,重新来过。将出问题的app下的所有模型和数据库中表保持一致,来重新映射。
- 将出问题的app下所有模型,和数据库中的表保持一致。
- 将出问题的app下的所有迁移脚本文件都删掉。在数据库中的
django_migration
表中将出问题的app相关的迁移记录都删除掉。 - 使用
makemigrations
,重新将模型生成一个迁移脚本。 - 使用
mirate --fake-initial
参数,将刚刚生成的迁移脚本,标记为已经完成(因为这些模型对应的表已经在数据库中存在,无需重新映射) - 完成。可以执行其他的映射了、
相关文章推荐
- Django2.0-db(12)-根据已有的表自动生成模型
- Django ORM模型:想说爱你不容易
- 详解关于Django中ORM数据库迁移的配置
- Django模型系统——ORM表结构对应关系
- 虚拟环境中Django使用python3完成模型类的迁移
- Django模型系统——ORM校园管理系统代码
- django模型orm进行group by
- web框架开发-Django模型层(1)之ORM简介和单表操作
- 【django】利用fbv模型与orm进行页面登录操作
- MySql 使用 EF Core 2.0 CodeFirst、DbFirst、数据库迁移(Migration)介绍及示例
- django模型ORM笔记
- django 2.0 添加外键后,迁移数据库的提示缺少参数on_delete问题
- Django 模型系统(model)&ORM--基础
- django ORM数据模型的定义
- Django中ORM模型总结(二)[模型类的对应关系,模型类的属性,字段类型]
- [Django实战] 第6篇 - 模型(ORM)
- Django 2.0 之Models(模型) 官方文档翻译(一)
- 支持“XXXDbContext”上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库(http://go.microsoft.com/fwlink/?LinkId=2
- django学习6 orm模型
- python django -2 ORM模型