Django - sqlclear 无法删除具有 AbstractUser 外键约束的数据库

Posted

技术标签:

【中文标题】Django - sqlclear 无法删除具有 AbstractUser 外键约束的数据库【英文标题】:Django - sqlclear fails to delete database with AbstractUser foreign key constraints 【发布时间】:2014-06-20 14:44:53 【问题描述】:

我正在使用 Django 1.6 + mysql。我的模型有一个扩展 AbstractUser 的 custom_user 类。

class CustomUser(AbstractUser):
    dob             = models.DateField()    
    class Meta:
        db_table    = 'custom_user'    

我想用./manage.py sqlclear | ./manage.py dbshell(as mentioned here)删除数据库

sqlclear 的输出是

BEGIN;
DROP TABLE `design`;
DROP TABLE `company`;
ALTER TABLE `custom_user_user_permissions` DROP FOREIGN KEY `customuser_id_refs_id_da27cb33`;
ALTER TABLE `custom_user_groups` DROP FOREIGN KEY `customuser_id_refs_id_d24c897a`;
DROP TABLE `custom_user`;
DROP TABLE `custom_user_user_permissions`;
DROP TABLE `custom_user_groups`;
DROP TABLE `book`;
DROP TABLE `author`;

COMMIT;

这失败并出现错误:

ERROR 1217 (23000) at line 6: Cannot delete or update a parent row: a foreign key constraint fails

前 2 个表(设计和公司)被删除。如果我再次运行该命令,我会得到 ​​p>

ERROR 1091 (42000) at line 2: Can't DROP 'customuser_id_refs_id_da27cb33'; check that column/key exists

【问题讨论】:

第 6 行是 drop table book 语句。您可以发布book 表的定义吗? 第 6 行实际上是 custom_user 模型。我已经用模型定义更新了帖子。抱歉打错了。 【参考方案1】:

当您尝试删除某个其他表所依赖的 custom_user 表时,听起来像错误 1。发生错误 2 是因为它试图删除已经被删除的外键。

ERROR 1217 可能是由我的 Django MySQL 体验中的三件事引起的:

1.您尝试操作(删除)的表在另一个表中有一个外键引用。

尝试:跟踪对您的“custom_user”表的所有 ForeignKey 引用,您的一个表可能依赖于它,因此您需要先找到并删除该表以解决错误 1217。

Example table structure:
Given 3 tables Customer, Orders, Shipment:
 Customer has no foreign keys
 Orders has a x = models.ForeignKey(Customer)
 Shipment has a y = models.ForeignKey(Orders)

所以一对多的关系是:customer->orders->shipment

如果你尝试过:

 mysql>drop table customer;   #you'd throw ERROR 1217.

这会起作用(因为向后依赖,所以按这个顺序):

mysql>drop table shipment;
mysql>drop table orders;
mysql>drop table customer;

2.您的表的 MySQL 数据库引擎不一样。尝试将它们更改为相同的东西。 要检查,请运行: mysql>select TABLE_NAME,ENGINE from information_schema.TABLES;

如果该查询的结果显示您的模型表具有不同的引擎 (INNODB/MYISAM),则通过在 mysql 提示符下运行此语句将不同的模型表更改为相同。

#For INNODB
mysql>ALTER TABLE custom_user ENGINE=INNODB;
#For MyISAM
mysql>ALTER TABLE custom_user_user_permissions ENGINE=MyISAM;

3.尝试在您的 settings.py 文件中关闭外键检查。 将此代码添加到您的数据库字典中。

DATABASES = 
'default': 
    ...         
    'OPTIONS': 
         "init_command": "SET foreign_key_checks = 0;",
    ,
 

【讨论】:

我正在扩展 Django 的 AbstractUser model。表custom_user_user_permissionscustom_user_groups 是自动创建的。我怀疑答案与它有关。 @buffer 你解决了这个问题吗?尝试删除原始查询中没有更改语句的表,并以不同的顺序。我建议在custom_user_user_permissionscustom_user_groups 之后删除'custom_user'; custom_user、customer_user_user_permission 或 custom_user_groups 都具有用于在表之间绑定条目的外键。 sql 是 Django 自动生成的。我想这是./manage.py sqlclear Django 命令的问题。目前,我已经绕过了 Django,直接执行了drop database; SQL 语句。

以上是关于Django - sqlclear 无法删除具有 AbstractUser 外键约束的数据库的主要内容,如果未能解决你的问题,请参考以下文章

Django sql清除所有应用程序

删除 Django 应用程序的正确方法是啥?

如何在django中删除具有重复列的行

无法在 django 的内置身份验证应用程序中删除用户

如何:创建一个视图和序列化器,用于添加,编辑和删除具有外部关系的对象django rest framework

Django 无法识别已删除/添加的文件