parseTime=True、loc=Local、charset=utf8mb4漏写或大小写错误(如true、local、utf8)会导致静默失败及time.Time字段全为零值;tcp须小写、host禁用localhost而用127.0.0.1;timeout仅控建连,readTimeout/writeTimeout才控SQL执行。

DSN里哪些参数写错会导致静默失败或time.Time解析为空
parseTime=True、loc=Local、charset=utf8mb4这三项漏掉或写错,gorm.Open()可能不报错但后续查出来的时间字段全是零值。常见错误包括:parseTime=true(小写true)、loc=local(小写)、charset=utf8(不支持emoji)。TCP协议部分必须是tcp,不能写成TCP或省略;host不能为localhost,建议用127.0.0.1避免DNS干扰。
timeout=readTimeout=writeTimeout在DSN里到底起不起作用
只写timeout=5s仅控制TCP建连阶段,对SQL执行无约束;真正影响查询超时的是readTimeout=30s和writeTimeout=60s,这两个必须显式加上,否则默认为0(不限制)。注意:GORM v2 不校验 DSN 里的这些参数是否生效,底层依赖 MySQL 驱动解析,写错大小写(如Readtimeout)或单位(如timeout=5漏掉s)都会被忽略。
SetMaxOpenConns设多少才不爆Too many connections
这个值必须跟 MySQL 的max_connections对齐,不能拍脑袋。查当前限制:SHOW VARIABLES LIKE 'max_connections';,假设返回200,则SetMaxOpenConns应设为120~160(60%~80%)。云数据库(如阿里云 RDS)建议更保守,按每核≈20连接估算。常见错误:SetMaxOpenConns=0(等于不限制)、=500(MySQL很快报错)、=10(并发稍高就卡住)。
为什么db.Ping()必须紧接gorm.Open()之后调用
gorm.Open()只是初始化结构,不建立真实连接。首笔查询才真正拨号——这时候网络不通、密码错、DNS失败,全堆在第一个HTTP请求上,导致白屏或超时。v2中db.Ping()已弃用,必须用db.Session(&gorm.Session{}).Ping()。漏掉这步,日志里“DB initialized”看似成功,实际服务一启动就崩在第一笔查询。











