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

标签 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 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 个表(设计和公司)被删除。如果我再次运行命令,我会得到

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

最佳答案

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

在我的 Django MySQL 体验中,错误 1217 可能是由三件事引起的:

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)

所以一对多关系是:客户->订单->发货

所以如果你尝试过:

 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;",
    },
 }
}

关于mysql - Django - sqlclear 无法删除具有 AbstractUser 外键约束的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23453154/

相关文章:

mysql - 防止 'ALL' 输入 Mysql 解释 SQL

python - Django:移动 'oscar' 站点包

django - 不小心删除了我的django南迁移目录

Django 中间表用多对多字段代替外键?

php - mysql 下一个和上一个

PHP函数str_replace应该放在MVC的什么地方?

php - 从 MySQL 按 IP 行获取所有用户名

python - Wagtail - 扩展 PageChooserBlock 以支持外部 URL

python - 如何阻止 Celery 在此任务中创建重复的用户?

django-models - Django postgres - 不允许多个主键错误