Django - sqlclear无法使用AbstractUser外键约束删除数据库

时间:2014-05-04 06:01:21

标签: mysql django django-database django-manage.py

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

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

我想要使用./manage.py sqlclear | ./manage.py dbshellas 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个表(设计和公司)被删除。如果我再次运行命令,我会得到

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

1 个答案:

答案 0 :(得分:1)

当你试图删除一些其他表依赖的custom_user表时,听起来像是错误1。错误2的发生是因为它试图删除已经丢弃的外键。

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

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

尝试:跟踪所有对您的' 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-> shipping

所以,如果你尝试过:

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

这会起作用(由于向后依赖性,按此顺序):

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

2.桌面的MySQL数据库引擎不一样。尝试将它们更改为同一个东西。 要检查,请运行: mysql>从information_schema.TABLES中选择TABLE_NAME,ENGINE;

如果该查询的结果显示您的模型表具有不同的引擎(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;",
    },
 }
}