使用South时候由于两个相同id的文件引起的问题
由于之前版本控制的一个小失误,
在主分子上面调用python manage.py makemigrations生成了 0058_auto__add_unique_setting_name_value.py
在继承分支上调用python manage.py makemigrations生成了 0058_auto__add_statistic.py
所以当主分子合并到继承分支上面的时候就会产生这样的现象:
/path/to/migrations
0058_auto__add_unique_setting_name_value.py
0058_auto__add_statistic.py
针对这样的情况,我们在同步数据库的时候就需要带上 --merge 参数了
python manage.py migrate --merge
上面的两条同步记录正常更新的数据库了
观察数据库的south_migrations表,也是正确的
id appname migration
57 db 0055_auto__add_xxx
58 db 0056_auto__add_xxxx
59 db 0057_auto__add_xxxxx
60 db 0058_auto__add_statistic
61 db 0058_auto__add_unique_setting_name_value
现在,我修改了app的models中关于Statist表的定义,增加了两个字段
然后调用 python manage.py schemamigration MyAppName --auto
正确生成了下面的文件
0059_auto__add_statistic.py
注意,我在上面的两个58中已经有了statistic表了,所以这个肯定是错误的
实际运行的时候也证明的我的猜想是正确的,python manage.py migrate --merge的时候报了already exists的错误
由于生产环境里面0058_auto__add_statistic和0058_auto__add_unique_setting_name_value
肯定是已经同步到数据库里面去了,所以我不能在这两个文件下面做文章
解决方法:
将0058_auto__add_statistic.py改名为0059_auto__add_statistic.py
将south_migrations表中对应的条目中的0058_auto__add_statistic也对应的更改一下
然后调用 python manage.py schemamigration MyAppName --auto,这时候生成了这么个文件
0060_auto__add_field_statistic_lesson_count__add_field_statistic_last_updat.py
好了,文件已经有了,再将刚刚改了名字的文件和数据库再改回去,然后将上面的0060改成0059
也就是0059_auto__add_field_statistic_lesson_count__add_field_statistic_last_updat
然后调用 python manage.py migrate --merge
搞定~
注:
期间遇到的问题以及解决方法
0058_auto__add_statistic
0058_auto__add_unique_setting_name_value
也就是0059_xxxxxx.py
文件生成的时候将0058_auto__add_unique_setting_name_value里面的更改也整合到0060里面去了
(0058_auto__add_unique_setting_name_value这个文件里面的变动是加了一个unique约束)
所以在migrate我改名后的59号文件的时候会报一个'Duplicate key name'的错误,提示该约束以及存在
直接编辑0059_xxxxxx.py,将def forwards(self, orm)下面的db.create_unique('Setting', ['name', 'value'])
改成这样的:
try:
db.create_unique('Setting', ['name', 'value'])
except Exception, e:
if not 'Duplicate key name' in str(e):
print e
保存,再试试就OK了.
记录一下今天的这个问题.
当然,实际上还有一种解决方法,如果两个58号还没有变更到生产环境下面去的话,可以直接将两个58号的文件删除
然后重新python manage.py schemamigration MyAppName --auto生成文件.这肯定是最省事的.
使用South时候由于两个相同id的文件引起的问题的更多相关文章
- 在jsp中重复定义了两个相同id的标签导致的错误
jQuery做前台开发的程序有一个页面在IE11和谷歌浏览器下都没有问题,但是在XP的IE8下运行就报错: 后来发现是定义了两个相同id的标签所致. 在icCard.jsp中定义的标签: 在carIn ...
- git rev-list 按照时间来列出两个 commit id 之间的相差数
git rev-list 按照时间来列出两个 commit id 之间的相差数 git rev-list: Lists commit objects in reverse chronological ...
- 用户id,组id和文件访问权限
实际用户ID和实际组ID:标示了我们究竟是谁,这两个字段在登录时取自口令文件中的登录项 有效用户ID和有效组ID以及附属组ID:决定了我们的文件的访问权限(通常有效用户ID等于实际用户ID,有效组ID ...
- 两次fopen不同的文件返回相同的FILE* 地址
最近接触一个垃圾程序,出现一个奇怪的bug,现象是两次fopen不同的文件返回相同的FILE*地址,第二次返回的FILE*有时候无端端的就被关闭了.以下代码是对这个bug的概括: auto fp1 = ...
- 【Linux学习笔记】用nc实现两台主机间的文件传输(不需要输密码)
通常,可以用scp完成两台主机间的文件传输任务,但在主机间未建立信任关系的情况下,scp每次都需要输入密码,用起来感觉不是很方便,之前这篇笔记介绍过不用输入密码执行脚本或传输文件的方法,但对于一些临时 ...
- Linux 两台服务器之间传输文件和文件夹
今天处理一个项目要迁移的问题,突然发现这么多图片怎么移过去,可能第一时间想到的是先从这台服务器下载下来,然后再上传到另外一台服务器上面去,这个方法确实是可行,但是实在是太费时间了,今天我就教大家怎么快 ...
- Git提取两次提交的差异文件
1. 创建清单文件 获取两次提交之间的文件差异,并将文件清单保存到diff.txt文件中 Git diff --name-only 173d3010 18586360 > diff.txt 2. ...
- egg.js 通过 form 和 ajax 两种方式上传文件并自定义目录和文件名
egg.js 通过 form 和 ajax 两种方式上传文件并自定义目录和文件名 评论:10 · 阅读:8437· 喜欢:0 一.需求 二.CSRF 校验 三.通过 form 表单上传文件 四.通过 ...
- 简单的 通过ID获取文件名称
模型中的方法class 模型名{ /** * 通过ID获取文件名称 */ public static function getNameById($id) { $model = self::findOn ...
随机推荐
- C++编译器函数模版机制剖析 - 函数模版的本质
思考:为什么函数模板能够和函数重载放在一块.C++编译器是怎样提供函数模板机制的? demo 1 #include <cstdio> #include <iostream> u ...
- Javascript模板引擎handlebars使用实例及技巧
转:http://rfyiamcool.blog.51cto.com/1030776/1278620 我们在开发的时候针对DOM操作,用简单的JS应用来说不成问题,但如果你对视图的每次更新都需要对我文 ...
- Redis学习手册(开篇)
一.简介: 在过去的几年中,NoSQL数据库一度成为高并发.海量数据存储解决方案的代名词,与之相应的产品也呈现出雨后春笋般的生机.然而在众多产品中能够脱颖而出的却屈指可数,如Redis.MongoDB ...
- 垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
Delphi 是一个基本上被我遗忘的工具, 要不是在使用RapidSql , 我是收不到Embarcadero 公司发出的邀请来參加Delphi XE5的公布会的. 有人可能要问为什么是Embarca ...
- How does CCFileUTils::fullPathForFilename work
OverView The purpose of this document is show you how does function CCFileUtils::fullPathForFilename ...
- 嵌入式Linux-objdump命令的使用
objdump命令的使用 objdump命令是Linux下的反汇编目标文件或者可执行文件的命令,它还有其他作用,下面以ELF格式可执行文件test为例详细介绍: objdump -f test 显示t ...
- WWDC2016 Session笔记 – Xcode 8 Auto Layout新特性
目录 1.Incrementally Adopting Auto Layout 2.Design and Runtime Constraints 3.NSGridView 4.Layout Feedb ...
- Centos如何设置静态IP地址,LINUX怎么修改IP地址
1.登陆连接centos系统,输入 ifconfig 可以查看到当前本机的IP地址信息 2.临时设置IP地址: 输入 ifconfig eth0 (默认是第一个网卡) 后面接IP地址, 网络掩码和 网 ...
- JQ 如何设置单选按钮问题
<input type="radio" name="db_12" value="2" checked="checked/&g ...
- Linux云主机安装JDK,配置hadoop的详细方式
云主机我使用的是青云的,还有好多其他品牌,比如阿里云 unitedstack 等等. 注册完青云后,会有试用券发到账户,可以利用此券试用其服务. 1 首先创建好一个主机,按照提示选择好系统,创建好一个 ...