Django IntegrityError:没有默认值

Posted

技术标签:

【中文标题】Django IntegrityError:没有默认值【英文标题】:Django IntegrityError: no default value 【发布时间】:2016-12-27 09:58:18 【问题描述】:

我需要运行更长的 SQL 查询才能将数据从一个表迁移到另一个表。直到本周我迁移到 Django 1.9.2 和 Python 3.5 时,它一直运行良好。

问题是该表有一个字段“last_update”,默认情况下为 NULL。表定义为

last_update = models.DateTimeField("last updated",null=True, auto_now_add=False, auto_now=True)

我还检查了 mysql Workbench,该表确实设置为允许在该字段上使用 NULL,默认值为 NULL。

查询在大约 30 分钟后崩溃并显示错误消息:

django.db.utils.IntegrityError: (1364, "Field 'last_update' doesn't have a default value")

非常烦人!如何在该表中插入行?

根据请求,这里是表定义:

CREATE TABLE `google_pla_plaproducts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `product_code` varchar(55) CHARACTER SET utf8 NOT NULL,
  `min_bid` decimal(20,4) NOT NULL,
  `current_bid` decimal(20,4) NOT NULL,
  `max_bid` decimal(20,4) NOT NULL,
  `creation_date` datetime(6),
  `last_update` datetime(6) DEFAULT NULL,
  `status_change` datetime(6) DEFAULT NULL,
  `starting_bid` decimal(20,4) NOT NULL,
  `adgroup_id` int(11) NOT NULL,
  `status_id` int(11) NOT NULL,
  `product_price` decimal(20,4) NOT NULL,
  PRIMARY KEY (`id`,`product_code`,`adgroup_id`),
  KEY `google_p_adgroup_id_3b7c9d4ecddd04ba_fk_google_pla_plaadgroup_id` (`adgroup_id`),
  KEY `google_pla_plaprod_status_id_2f8113a5ef0dd021_fk_globs_status_id` (`status_id`),
  KEY `idx_prod_code` (`product_code`),
  CONSTRAINT `google_p_adgroup_id_3b7c9d4ecddd04ba_fk_google_pla_plaadgroup_id` FOREIGN KEY (`adgroup_id`) REFERENCES `google_pla_plaadgroup` (`id`),
  CONSTRAINT `google_pla_plaprod_status_id_2f8113a5ef0dd021_fk_globs_status_id` FOREIGN KEY (`status_id`) REFERENCES `globs_status` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=88949 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

【问题讨论】:

可以添加workbench生成的表的SQL定义吗? 另外值得注意的是,该表实际上包含该字段的空值! 可以加models.DateTimeField(default=None, ...) 尝试删除该应用程序中的 django 迁移文件,然后使用 python manage.py makemigrations-> 再次迁移。 @Aison 我确实玩了一段时间的迁移。最终才刚刚开始工作。 【参考方案1】:

我最终修改了表格几次。我没有尝试 Rohit 的建议,默认 = 无。在使用多个数据库迁移后,它又开始工作了。

【讨论】:

【参考方案2】:

updated = models.DateTimeField(default=None, auto_now=True, auto_now_add=False)

这应该可以。 我以前用过这个,对我来说很好用。

【讨论】:

您不需要auto_nowauto_now_add。来自docs:“选项 auto_now_add、auto_now 和 default 是互斥的。这些选项的任何组合都会导致错误。” @Rohit Chopra:不,不是这样。它以某种方式再次起作用。也许在玩弄了迁移文件之后......

以上是关于Django IntegrityError:没有默认值的主要内容,如果未能解决你的问题,请参考以下文章

Django写入数据库,IntegrityError

django:IntegrityError:重复键值违反唯一约束

Django:迁移到 NullBooleanField 失败,IntegrityError“包含空值”

django.db.utils.IntegrityError:重复键值违反唯一约束“django_content_type_pkey”

Django bulk_create 忽略导致 IntegrityError 的行?

Postrgersql+Django:NULL值导致IntegrityError:重复键值违反唯一约束