由于之前版本控制的一个小失误,

在主分子上面调用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的文件引起的问题的更多相关文章

  1. 在jsp中重复定义了两个相同id的标签导致的错误

    jQuery做前台开发的程序有一个页面在IE11和谷歌浏览器下都没有问题,但是在XP的IE8下运行就报错: 后来发现是定义了两个相同id的标签所致. 在icCard.jsp中定义的标签: 在carIn ...

  2. git rev-list 按照时间来列出两个 commit id 之间的相差数

    git rev-list 按照时间来列出两个 commit id 之间的相差数 git rev-list: Lists commit objects in reverse chronological ...

  3. 用户id,组id和文件访问权限

    实际用户ID和实际组ID:标示了我们究竟是谁,这两个字段在登录时取自口令文件中的登录项 有效用户ID和有效组ID以及附属组ID:决定了我们的文件的访问权限(通常有效用户ID等于实际用户ID,有效组ID ...

  4. 两次fopen不同的文件返回相同的FILE* 地址

    最近接触一个垃圾程序,出现一个奇怪的bug,现象是两次fopen不同的文件返回相同的FILE*地址,第二次返回的FILE*有时候无端端的就被关闭了.以下代码是对这个bug的概括: auto fp1 = ...

  5. 【Linux学习笔记】用nc实现两台主机间的文件传输(不需要输密码)

    通常,可以用scp完成两台主机间的文件传输任务,但在主机间未建立信任关系的情况下,scp每次都需要输入密码,用起来感觉不是很方便,之前这篇笔记介绍过不用输入密码执行脚本或传输文件的方法,但对于一些临时 ...

  6. Linux 两台服务器之间传输文件和文件夹

    今天处理一个项目要迁移的问题,突然发现这么多图片怎么移过去,可能第一时间想到的是先从这台服务器下载下来,然后再上传到另外一台服务器上面去,这个方法确实是可行,但是实在是太费时间了,今天我就教大家怎么快 ...

  7. Git提取两次提交的差异文件

    1. 创建清单文件 获取两次提交之间的文件差异,并将文件清单保存到diff.txt文件中 Git diff --name-only 173d3010 18586360 > diff.txt 2. ...

  8. egg.js 通过 form 和 ajax 两种方式上传文件并自定义目录和文件名

    egg.js 通过 form 和 ajax 两种方式上传文件并自定义目录和文件名 评论:10 · 阅读:8437· 喜欢:0 一.需求 二.CSRF 校验 三.通过 form 表单上传文件 四.通过 ...

  9. 简单的 通过ID获取文件名称

    模型中的方法class 模型名{ /** * 通过ID获取文件名称 */ public static function getNameById($id) { $model = self::findOn ...

随机推荐

  1. 【转】Spring的WebServiceTemplate访问WebService的方法及其本质原理

    WebService客户端调用的本质就是将SAOP格式的XML通过通信协议发送到WebService的服务器端,然后接收服务器端返回的XML. 本文简单介绍一下如何通过Spring提供的WebServ ...

  2. Mac下安装cocos2d-x环境

    安装后xcode之后,下载cocos2dx压缩包,解压 通过中断cd到cocos2dx文件夹内 输入下行命令 sudo ./install-templates-xcode.sh 执行成功后打开xcod ...

  3. Redis学习手册(管线)

    一.请求应答协议和RTT: Redis是一种典型的基于C/S模型的TCP服务器.在客户端与服务器的通讯过程中,通常都是客户端率先发起请求,服务器在接收到请求后执行相应的任务,最后再将获取的数据或处理结 ...

  4. jQuery动态实现title的修改 失效问题

    最近做了一个网站,一切都很顺利,在上线的时候,突然发现一个严重的问题,开始面对这个问题,完全不知所措(在goole.火狐.IE9及其以上都没得问题:IE8及其低版本都失效)只是浏览器弹出一个bug,但 ...

  5. 动态使用webservice,以及含有ref类型的参数的问题

    public class WSHelper { /// < summary> /// 动态调用web服务 /// < /summary> /// < param name ...

  6. Linux操作系统搭建JDK开发环境

    在Linuxer系统中,jdk环境常常是必需的,下面介绍下Oracle官方JDK安装方式 第一步:去jdk官网下载对应版本的JDK安装文件 第二步:解压文件,修改文件名 $ sudo mkdir /u ...

  7. DataContext 数据在F5刷新频繁,会出现数据读取错误

    DataContext 数据在F5刷新频繁,会出现数据读取错误 DataContext是 Linq to sql数据模型的底层数据库对象所有LInq数据表对象都是由它派生的, 只要建立一个数据库操作, ...

  8. works-er

  9. mysql分区功能详细介绍,以及实例

    一,什么是数据库分区 前段时间写过一篇关于mysql分表的 的文章,下面来说一下什么是数据库分区,以mysql为例.mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下 ...

  10. PIMP模式的理解

    看了[C++程序设计技巧]Pimpl机制 之后,想了半天才理解    // MyClass.h 2: class MyClassImpl; // forward declaration 3: clas ...