zoukankan      html  css  js  c++  java
  • 使用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生成文件.这肯定是最省事的.

  • 相关阅读:
    JavaScript Object Notation 轻量级的数据交换 json
    一步步打造基于ASP.NET的CMS内容管理系统Step3 添加新闻页面
    显示MSSQL SQL语句执行的时间
    解决国外空间数据库乱码的问题
    一步步打造基于ASP.NET的CMS内容管理系统Step4 权限设定(补充)
    笔记本键盘输入法失灵:fn键功能反了
    Jquery:十分钟打造一个类似是Twitter的系统,附源代码
    一步步打造基于ASP.NET的CMS内容管理系统Step1类别管理
    一步步打造基于ASP.NET的CMS内容管理系统Step2 系统配置(附源代码)
    google走后,google地图,google adsens等相关问题的看法
  • 原文地址:https://www.cnblogs.com/MrWho/p/solve_problems_while_using_south_to_migrate_db.html
Copyright © 2011-2022 走看看