django.db.utils.OperationalError: (1050, “Table ‘someTable‘ already exists“)

第一种情况

新建了一个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文件,里面是

  1. 若已有同名表,先删除这个表;
  2. 再创建表(是旧表的字段,当然没新字段了);
  3. 再添加数据。

(a)然后想到Navicat可以直接编辑表结构,即设计表,我就手动在Navicat里对表添加了新字段。

(b)又想到也可以删除转储文件中删除表、创建表的语句,只保留添加数据的语句,再导入数据,但未测试。

方法二

第一种情况的方法二中--fake的意思是,当前模型文件与数据库中不一致时,如模型文件中比数据库新添加了一些字段,则迁移时忽略这些不一致,即迁移后数据库中不会多出新添加的字段。

执行第一种情况的方法二后,表中没有新添加的字段,再执行第二种情况的方法一中的(a)或(b)。

方法三

根据数据库中的表,反向生成模型代码

  • 用Navicat等软件手动修改表结构,改成符合需求的样子
  • 再删除models.py中的代码
  • python manage.py inspectdb > 应用名/models.py

参考链接1,参考链接2

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值