在线更新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