开发了一个自动生成建表语句的python小程序,用生成好的数据表插入数据,发现了问题。


运行环境 Runtime environment

1
2
3
操作系统: Windos10  
navicat: 15.0.2
mysql: 5.7.31

症状

scrapy 爬虫采集入库的时候,管道打印了报错日志。

1
ERROR 1364 (HY000): Field 'chembl_id' doesn't have a default value

问题原因

建表的sql语句中,chembl_id字段设置NOT NULL,不能为空,也没赋予默认值。

导致的报错!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE TABLE `!!!!此处填写表名!!!!` (
`id` int(25) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id(仅作计数使用不可作为关联依据!)',
`chembl_id` varchar(648) NOT NULL COMMENT 'chembl_id',
`chembl_target_type` varchar(648) DEFAULT NULL COMMENT 'chembl_target_type',
`chembl_target_name` varchar(648) DEFAULT NULL COMMENT 'chembl_target_name',
`chembl_target_alias` json DEFAULT NULL COMMENT 'chembl_target_alias',
`chembl_target_organisim` varchar(648) DEFAULT NULL COMMENT 'chembl_target_organisim',
`chembl_target_classification` json DEFAULT NULL COMMENT 'chembl_target_classification',
`chembl_drug_name` json DEFAULT NULL COMMENT 'chembl_drug_name',
`chembl_drug` json DEFAULT NULL COMMENT 'chembl_drug',
`guidetopharmacology` json DEFAULT NULL COMMENT 'guidetopharmacology',
`human_protein_atlas` json DEFAULT NULL COMMENT 'human_protein_atlas',
`open_targets` json DEFAULT NULL COMMENT 'open_targets',
`chembl_pharos_url` json DEFAULT NULL COMMENT 'chembl_pharos_url',
`ebi_chembl_url` text COMMENT 'ebi_chembl_url',
`raw_datas` json DEFAULT NULL COMMENT 'raw_datas',
`update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '采集时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `unique_id` (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='总之就是特别牛逼的一表数据';

解决办法

将对应语句的NOT NULL改为DEFAULT NULL即可。

1
`chembl_id` varchar(648) DEFAULT NULL COMMENT 'chembl_id',

但是要结合业务场景,如果是为了建立索引的字段,那就要看具体情况来修改了。