使用GORM向MySQL插入数据时报1364错误:varchar类型envelopeId字段无默认值
报错排查与解决方法
Error 1364报错的核心原因是:你插入数据时,没有给非空且未设置默认值的数据库字段传值,MySQL无法生成合法的行数据所以抛出异常。你虽然在代码里给envelopeId赋了值,但实际上GORM生成INSERT语句时没有带上这个字段,才会触发报错。
排查步骤
- 首先检查
Envelope结构体的字段定义,GORM默认会把结构体的大驼峰字段名转为蛇形作为数据库映射字段,比如你结构体字段如果命名为EnvelopeId,GORM默认会映射到envelope_id数据库字段,和你实际库表里的envelopeId(小驼峰)不匹配,自然不会给这个字段赋值
错误的结构体定义示例:
type Envelope struct { EnvelopeId string // 默认映射为envelope_id,和库表字段对不上 // 其余字段省略 }
- 确认
EnvelopeId字段有没有加gorm:"-"的忽略标签,加了这个标签的字段GORM在执行插入、更新操作时会直接跳过,不会代入SQL语句 - 开启GORM的SQL执行日志,直接查看实际执行的INSERT语句里有没有包含
envelopeId字段和对应的值,可以直接定位问题根源
开启SQL日志的示例代码:
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Info), // 开启Info级别日志,会打印所有执行的SQL })
解决方法
最常见的是字段映射不匹配问题,直接给结构体字段加gorm标签指定对应的数据库字段名即可:
type Envelope struct { EnvelopeId string `gorm:"column:envelopeId;primaryKey"` // 显式指定映射的数据库字段,同时标记为主键 // 其余字段省略 }
如果排查后发现是其他非空字段没有赋值,补充对应字段的赋值逻辑即可。
内容的提问来源于stack exchange,提问作者TJUzengle
相关产品推荐
相关产品推荐

