3

我正在尝试将 provider 上的 foreignKey 和 bestbuy_type 上的 M2Mfield 链接 - 但是每次我尝试将任何内容保存到这些字段中的任何一个时,我都会收到错误消息:

(1452, 'Cannot add or update a child row: a foreign key constraint fails (`savingschampion`.`products_masterproduct`, CONSTRAINT `provider_id_refs_id_2ea9c584` FOREIGN KEY (`provider_id`) REFERENCES `products_provider` (`id`))')

这些字段在我的模型中指定为:

class MasterProduct(BaseModel):
    provider = models.ForeignKey('products.Provider', related_name = 'master_products', blank=True, null=True)
    bestbuy_type = models.ManyToManyField('products.BestBuy',blank=True, null=True)
    ...other (no relationship) fields which work fine

使用它实际上会在 django admin 中为字段填充正确的值,但是在保存时会产生错误。

使用 MySQL 和指定的引擎是:

'ENGINE': 'django.db.backends.mysql'

有谁知道为什么会这样?

4

4 回答 4

8

事实证明,正在创建的新表使用的是 InnoDB,而不是像现有表那样使用 MyISAM。

将此行添加到我的数据库配置中,通过强制 South 创建的新表使用 MyISAM 为我解决了这个问题:

'OPTIONS'  : { 'init_command' : 'SET storage_engine=MyISAM', },
于 2012-10-09T13:27:58.040 回答
0

'OPTIONS' : { 'init_command' : 'SET storage_engine=MyISAM', }, <<-- 这对我不起作用,但在清理我的数据库表中的数据后,我想修改它,虽然这不是一个好方法跟随。

于 2021-04-23T06:19:59.840 回答
0

我已经解决了将所有 MyISAM 类型表转换为 InnoDB 应用此脚本生成的 SQL 命令的相同问题:

SET @DATABASE_NAME = 'name_of_your_db';

SELECT  CONCAT('ALTER TABLE `', table_name, '` ENGINE=InnoDB;') AS sql_statements
FROM    information_schema.tables AS tb
WHERE   table_schema = @DATABASE_NAME
AND     `ENGINE` = 'MyISAM'
AND     `TABLE_TYPE` = 'BASE TABLE'
ORDER BY table_name DESC;

然后在 django 设置中使用此选项:

'OPTIONS'  : { 'init_command' : 'SET storage_engine=InnoDB', },
于 2021-06-09T10:45:24.010 回答
0

备份表中的数据,然后从表中删除数据。再次运行迁移它会正常工作。

于 2021-07-26T08:42:45.120 回答