django迁移文件migrations的实现


Posted in Python onMarch 31, 2020

当模型models.py中发生改变时,即在models.py文件操作数据表,使得数据库中的表结构发生变化,需要使用命令,记录这些操作,类似于日记。

修改完models.py后,先在Terminal下执行命令

python manage.py makemigrations

这是仅仅是生成迁移记录,执行过后,数据库中的表并未发生变化。若是models发生改变,但是执行以上命令,显示的是

No changes detected

则需要执行

python manage.py makemigrations + 你所改变的models.py所在的目录

然后,要想表结构发生变化,还要执行以下命令

python manage.py migrate

执行完毕后,数据库中的表结构已经改变

补充知识:django使用migrations迁移版本和数据库中报错解决方案

回滚django的migration:

https://stackoverflow.com/questions/32123477/django-revert-last-migration

I've made a migration that added a new table and want to revert it and delete the migration, without creating a new migration.

How do I do it? Is there a command to revert last migration and then I can simply delete the migration file?


You can revert by migrating to the previous migration.

For example, if your last two migrations are:

0010_previous_migration
0011_migration_to_revert
Then you would do:

./manage.py migrate my_app 0010_previous_migration 
You can then delete migration 0011_migration_to_revert.

If you're using Django 1.8+, you can show the names of all the migrations with

./manage.py showmigrations my_app
To reverse all migrations for an app, you can run:

./manage.py migrate my_app zero

1、到数据库表django_migrations中查看app中看看app列

django迁移文件migrations的实现

2、到项目对应的app模块中打开migrations文件查看生成的文件与数据库app列中的是不是一样

django迁移文件migrations的实现

3.找到哪里不一致的文件,然后使用python manage.py --fake [版本名字],将这个版本标记为已经映射

如果还是报错就按照下面执行

1、删除指定app下migrations和数据库表django_migrations中和这个app相关的版本号,

2、将模型中的字段和数据库中的字段保持一致,再使用命令python manage.py makemigrations重新生成一个初始化的迁移脚本。

3、再使用命令python manage.py makemigrations --fake-initial来将这个初始化的迁移脚本标记为已经映射。之后再修改就没有问题了。

更多关于迁移脚本的。请查看官方文档:https://docs.djangoproject.com/en/2.0/topics/migrations/

makemigrations和migrate时django都做了什么?

makemigrations:

执行makemigrations时检测models文件变化,在migrations文件夹中生成变更的sql的py文件

migrate:检测django_migrations表,迁移过的表会记录在其中并不再执行migrate,未找到执行记录则进行migrate

不要随意删除django项目目录下的 migrations文件夹,里面会记录models文件每次makemigrations操作,误删后,makemigrations会重新生成

#执行python manage.py makemigrations命令时报错问题及解决办法:

在修改了models.py后,有些用户会喜欢用python manage.py makemigrations生成对应的py代码。

但有时执行python manage.py makemigrations命令(也可能人比较皮,把migrations文件夹给删了),会提示"No changes detected." 可能有用的解决方式如下:

先 python manage.py makemigrations --empty yourappname 生成一个空的initial.py

再 python manage.py makemigrations 生成原先的model对应的migration file

django-关于manage.py migrate无效的问题

问题描述:

已有的model,修改之后,想重新建模,于是将migrations文件夹中除__init__.py之外其他文件都删掉,再次执行以下步骤python manage.py makemigrations确认成功,执行python manage.py migrate,提示No migrations to apply. 表示一脸懵逼。再次修改,指定表名,再次尝试,发现问题依旧,表示二脸懵逼

排查过程

python manage.py dbshell 进到数据库里面,查看是否表已存在

结果:表不存在

检查migrations文件

结果:文件没问题

百度 google 各种搜,乱投医,各种尝试

解决方案

python manage.py dbshell 进到数据库中,执行delete from django_migrations where app='your_appname';

python manage.py makemigrations(若migrations文件未删除,可不执行这一步)

python manage.py migrate 好啦,大功告成

原因分析

查看django_migrations表结构

建表语句:

CREATE TABLE "django_migrations" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "app" varchar(255) NOT NULL, "name" varchar(255) NOT NULL, "applied" datetime NOT NULL);

原因

造成多次应用migrations失败的原因是,当前model是修改过的,原来的migrations已经被我删除,但是,重新生成的migrations使用递增整数记名,所以,在django_migrations表中0001,0002等前面几个数字的文件都已被记录,在Django看来,被记录了就相当于已应用,所以,会出现刚开始的No migrations to apply.

避免方案

有强迫症删除migrations文件的同学(比如我),请同时到数据库中删除相应记录

没有强迫症的同学,可以继续生成新的migrations,旧的就不必理会了

题外话

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

另外,在使用上述命令查看0002文件的sql语句时发现,django会新建一个表user_new,然后插入user表中的数据,再把user表删掉,再把user_new重命名为user。所以,修改model的时候,不必担心原有数据会丢失。

临时解决:

在models中添加了一个model,makemigrations成功后,如果migrate提示no apply --》查看django——migrations是否有对应model的name记录,如果没有记录 --》删除model,再次makemigrations、migrate(提示无表,数据库中手动创建对应表名)--》再添加model,再次makemigrations、migrate即可

上述问题出现的根因:项目目录下面没有留存/migrations/ 文件夹及迁移文件,导致,每次项目迁移记得保存好这个目录的文件

以上这篇django迁移文件migrations的实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用WMI检测windows系统信息、硬盘信息、网卡信息的方法
May 15 Python
python 统计代码行数简单实例
May 04 Python
python中set()函数简介及实例解析
Jan 09 Python
python 通过xml获取测试节点和属性的实例
Mar 31 Python
python 列表删除所有指定元素的方法
Apr 19 Python
用PyInstaller把Python代码打包成单个独立的exe可执行文件
May 26 Python
使用python对多个txt文件中的数据进行筛选的方法
Jul 10 Python
面向对象学习之pygame坦克大战
Sep 11 Python
python通过安装itchat包实现微信自动回复收到的春节祝福
Jan 19 Python
python实现图片转换成素描和漫画格式
Aug 19 Python
Python获取android设备cpu和内存占用情况
Nov 15 Python
Pytorch实现图像识别之数字识别(附详细注释)
May 11 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
Mar 31 #Python
浅谈Django中的QueryDict元素为数组的坑
Mar 31 #Python
Python + selenium + crontab实现每日定时自动打卡功能
Mar 31 #Python
python实现udp聊天窗口
Mar 31 #Python
浅谈在django中使用filter()(即对QuerySet操作)时踩的坑
Mar 31 #Python
Python sorted排序方法如何实现
Mar 31 #Python
解决Django中checkbox复选框的传值问题
Mar 31 #Python
You might like
PHP下常用正则表达式整理
2010/10/26 PHP
基于php权限分配的实现代码
2013/04/28 PHP
zend framework文件上传功能实例代码
2013/12/25 PHP
php实现12306火车票余票查询和价格查询(12306火车票查询)
2014/01/14 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
2015/09/14 PHP
php工具型代码之印章抠图
2018/07/18 PHP
PHP生成指定范围内的N个不重复的随机数
2019/03/18 PHP
Tab页界面,用jQuery及Ajax技术实现
2009/09/21 Javascript
js使用函数绑定技术改变事件处理程序的作用域
2011/12/26 Javascript
JavaScript获取客户端计算机硬件及系统等信息的方法
2014/01/02 Javascript
JS点击链接后慢慢展开隐藏着图片的方法
2015/02/17 Javascript
简单介绍JavaScript的变量和数据类型
2015/06/03 Javascript
原生js调用json方法总结
2018/02/22 Javascript
JS获取url参数,JS发送json格式的POST请求方法
2018/03/29 Javascript
微信小程序实现打卡日历功能
2020/09/21 Javascript
[00:44]华丽开场!DOTA2勇士令状带来全新对阵画面
2019/05/15 DOTA
老生常谈python函数参数的区别(必看篇)
2017/05/29 Python
安装Python和pygame及相应的环境变量配置(图文教程)
2017/06/04 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
2018/04/17 Python
python数字图像处理之骨架提取与分水岭算法
2018/04/27 Python
python版本五子棋的实现代码
2018/12/11 Python
Python使用pyserial进行串口通信的实例
2019/07/02 Python
解决python3 安装不了PIL的问题
2019/08/16 Python
Pytorch在NLP中的简单应用详解
2020/01/08 Python
利用Pytorch实现简单的线性回归算法
2020/01/15 Python
PyQt5中多线程模块QThread使用方法的实现
2020/01/31 Python
分享一个python的aes加密代码
2020/12/22 Python
CSS3中box-shadow的用法介绍
2015/07/15 HTML / CSS
利用HTML5 Canvas制作键盘及鼠标动画的实例分享
2016/03/15 HTML / CSS
Agoda香港:全球特价酒店预订
2017/05/07 全球购物
Expedia挪威官网:酒店、机票和租车
2018/03/03 全球购物
adidas马来西亚官网:adidas MY
2020/09/12 全球购物
Java程序开发中如何应用线程
2016/03/03 面试题
北京申奥口号
2014/06/19 职场文书
新员工入职感想
2015/08/07 职场文书
python plt.plot bar 如何设置绘图尺寸大小
2021/06/01 Python