当我尝试在Django中反向迁移其中一个迁移时,由于MariaDB中设置了sql_safe_update模式,我遇到了问题。
它为reverse运行的确切SQL语句是:
ALTER TABLE `user` DROP COLUMN `pin_code`;
我从Django得到的错误是:
MySQLdb.OperationalError: (1175, 'You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column')
现在我的数据库处于不一致的状态,因为该列已被删除,并且由于事务中没有运行MySQL的SQL语句,失败的迁移没有回滚。即使用--fake,它也会显示同样的错误。
有没有办法告诉django只在迁移期间使用sql_safe_update=0运行迁移?请注意,我不能全局关闭sql_safe_update,因为数据库管理员坚持不全局删除它。
另外,为什么DROP列需要一个WHERE语句也不完全清楚?
1条答案
按热度按时间kzmpq1sx1#
我进一步做了一些调试,发现它不会在ALTER TABLE语句上失败,而是在以下语句上失败:
这是django中的一个问题,因为在没有关键列上的WHERE子句的情况下运行django语句。这个名字没有索引,这就是为什么这个问题突然出现。
让我在Django为同样的事情开一张罚单。