Skip to content

附录B:GORM 常见错误排查指南 ​

连接错误 ​

错误现象原因解决
Error 1045Access denied用户名/密码错误验证 MySQL 凭据
Error 1049Unknown database数据库不存在创建数据库
connection refuseddial tcp: connect: connection refusedMySQL 未启动/端口错误启动 MySQL,检查端口
TLS errorTLS handshake timeoutSSL配置问题DSN加 tls=skip-verify 或配置SSL
parseTime时间字段是字符串忘了 parseTime=TrueDSN加 parseTime=True

迁移错误 ​

错误原因解决
列没有被删除AutoMigrate 不做减法用 Migrator().DropColumn 手动删
类型修改失败MySQL有限制检查类型兼容性,手动 ALTER
Error 1067default值无效检查default值格式(字符串要加引号)

查询错误 ​

错误原因解决
零值条件不生效struct零值被跳过用map或字符串条件
ErrRecordNotFoundFirst找不到记录用errors.Is判断,正常处理
Preload 不生效字段名拼错/未定义关联检查关联名和关联定义
N+1 查询循环中查询关联用 Preload 或 Joins

更新错误 ​

错误原因解决
零值字段不更新struct Updates跳过零值用 map 或 Select
Save 覆盖字段Save 全字段更新改用 Update/Updates
ErrMissingWhereClause批量更新没加WHERE加Where或用AllowGlobalUpdate
Hook不触发用了UpdateColumn改用Update(如需触发Hook)

关联错误 ​

错误原因解决
外键未被识别字段名不匹配约定显式指定 foreignKey
关联创建未写入忘记 Select("Relation")创建时加 Select
中间表名不一致两边 many2many 表名不同保持两边一致
Association 不生效忘记 Model()加 db.Model(&record)

事务错误 ​

错误原因解决
事务无效闭包中用db而非tx闭包中必须用tx
手动事务未Rollback忘记Rollback用defer或改用Transaction
事务超时事务执行时间过长拆分事务或优化SQL

性能问题 ​

问题排查方向
查询慢检查索引、EXPLAIN、慢查询日志
连接数飙升检查连接池配置(MaxOpenConns)
连接泄漏检查 rows.Close()、事务提交
内存高检查大结果集是否分批处理
N+1用 Debug() 查看SQL条数

把零散知识,整理成可以反复走的路。