在线更新django项目,遇到1050, "Table 'django_content_type' already exists"

Posted on 四 15 12月 2016 in python

场景

在前两天系统上线了,代码和数据库都在服务器上,运行几天后发现了几个bug。在本地修改代码,数据库用本地的。

由于修改了model, 所以本地的数据库进行了migrage操作。这个时候我把服务器的数据库导出到本地的testDb里面,运行migrate时发现它找不到需要修改的model部分,提示我no change found

策略 :

我的策略现在是: 开发数据库与线上数据库分离先测试后上线, 数据库增量备份
但现在的问题在于,开发的代码修改了model,而线上数据库没有migrate,直接连接到这个数据库时,运行时会报错找不到某些新加的字段。
后来找到了解决办法:

1. 首先回退代码到线上运行时commit点:

    git reset --hard xxxxxx

2. 修改settings.py, 连接数据库到`testDb`

3. 删除所有app下的migrations文件夹除了__init__.py的文件

    find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
    find . -path "*/migrations/*.pyc"  -delete

4. 在数据库中删除django_migrations表中的记录

   delete from django_migrations;

5. Reset the migrations

    python manage.py migrate --fake  
    python manage.py makemigrations  
    python manage.py migrate --fake-initial

6. 运行一下 (这里我用的是CentOS 7,其它的系统可能不一样,也有可能不同)

    sudo systemctl start xxx.service
    # 下一步操作前先停止一下 
    sudo systemctl stop xxx.service

7. 现在的情况应该是同步线上了。拉取最新代码,再按正常的migrate操作

    git pull origin release 
    python manage.py makemigrations
    python manage.py migrate

8. 现在的情况就是最新的代码了,数据库也同步了代码的更改。

参考链接:
http://stackoverflow.com/questions/29888046/django-1-8-create-initial-migrations-for-existing-schema
https://simpleisbetterthancomplex.com/tutorial/2016/07/26/how-to-reset-migrations.html