第一种情况
新建了一个Django项目,想使用之前项目的模型和数据库,将之前的模型代码复制过来,执行迁移时报错django.db.utils.OperationalError: (1050, "Table 'someTable' already exists"),意思是这个表在数据库中已存在。
解决方法
一.不保留数据库中那个同名表的数据
- 删除数据库中的这个表
- 删除migrations文件夹里和这个表相关的迁移文件
- 再删除数据库中django_migrations表中的对应记录,记录的name的值和删除的迁移文件的文件名相同
- python manage.py makemigrations
- python manage.py migrate
二.保留数据库中那个同名表的数据
- 删除migrations文件夹里和这个表相关的迁移文件(我是新建的项目,里面没有之前的迁移文件,不用执行这一步)
- 再删除数据库中django_migrations表中的对应记录,记录的name的值和删除的迁移文件的文件名相同
- python manage.py makemigrations
- python manage.py migrate --fake # fake的意思在第二种情况的方法二
第二种情况
若想使用之前项目的模型和数据库,同时新项目中对模型添加了一些字段,而且要保留数据库中的旧数据。
解决方法
先用Navicat等软件备份数据库或表,这是下面前两种方法的前提,第三种虽然不需要备份的文件,但备份保险。我是用Navicat右键点字段变化了的表,转储SQL文件,因为新添加了字段,我怕后面导入数据时因为字段不匹配导致导入出错,就选了结构和数据,但是这个文件有问题,后来才发现,下面再说。
方法一
执行第一种情况的方法一后,表中已有新添加的字段,再导入刚才备份的数据,然后表中新添加的字段又没了。一看刚才的SQL文件,里面是
- 若已有同名表,先删除这个表;
- 再创建表(是旧表的字段,当然没新字段了);
- 再添加数据。
(a)然后想到Navicat可以直接编辑表结构,即设计表,我就手动在Navicat里对表添加了新字段。
(b)又想到也可以删除转储文件中删除表、创建表的语句,只保留添加数据的语句,再导入数据,但未测试。
方法二
第一种情况的方法二中--fake的意思是,当前模型文件与数据库中不一致时,如模型文件中比数据库新添加了一些字段,则迁移时忽略这些不一致,即迁移后数据库中不会多出新添加的字段。
执行第一种情况的方法二后,表中没有新添加的字段,再执行第二种情况的方法一中的(a)或(b)。
方法三
根据数据库中的表,反向生成模型代码
- 用Navicat等软件手动修改表结构,改成符合需求的样子
- 再删除models.py中的代码
- python manage.py inspectdb > 应用名/models.py