You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 06:54:02