sqlx.QueryRow() 查不到数据返回 sql.ErrNoRows,需用 errors.Is(err, sql.ErrNoRows) 显式判断;其他错误(如连接失败、语法错误)应单独处理,不可一概而论。sqlx.QueryRow() 返回 sql.ErrNoRows 怎么安全处理?sqlx.QueryRow() 查不到数据时不会 panic,而是返回 sql.ErrNoRows ------ 这是 Go 常见的"预期错误",不是 bug。很多人直接忽略 err 或用 if err != nil 一锅端,结果把数据库连接失败、语法错误和"没查到"混为一谈。用 errors.Is(err, sql.ErrNoRows) 显式判断是否只是"无结果",其他 err 要单独处理(比如记录日志、返回 HTTP 404 或 500)别在 defer 里对 *sqlx.Row 调用 Scan():它只执行一次,重复调用会 panic如果业务上"查不到 = 合法状态",建议用指针接收,配合零值默认逻辑,例如:var name <em>string</em>,然后 if name == nil { / 未找到 */ }struct 字段怎么和 SQL 列名正确映射?sqlx 默认按字段名(非 tag)匹配列名,但 Go 字段大写、SQL 列常小写下划线,不配 tag 就会扫不到。必须加 db tag,例如:type User struct { ID int <code>db:"id" Name string db:"user_name" }tag 值区分大小写,要和 SELECT 出来的列名完全一致(哪怕数据库是 case-insensitive,sqlx 解析时不忽略大小写)不要混用 json 和 db tag:虽然字段名碰巧一样,但语义不同;一个漏写就 silently 失效如果用 SELECT *,务必确保 struct 字段数、顺序、tag 全部匹配,否则 Scan() 会报 sql: expected 3 destination arguments in Scan, not 2为什么 sqlx.Select() 返回空 slice 却不报错?sqlx.Select() 查不到数据时返回 \[\]T{}(长度为 0 的切片),err 是 nil ------ 这是设计使然,不是异常。新手常误以为"没报错=有数据",结果后续遍历时逻辑跳过。检查结果前先看 len(users),别只依赖 err如果业务要求"至少一条",需要手动校验:if len(users) == 0 { return fmt.Errorf("no users found") }注意:空 slice 和 nil slice 都能被 json.Marshal 正确序列化,但 == nil 判断对空 slice 返回 false,容易引发空指针联想错误事务里用 sqlx.NamedExec() 报 driver: bad connection?在 *sqlx.Tx 上用命名参数执行时出这个错,大概率不是连接断了,而是参数 map 里键名和 SQL 中的 :name 不匹配,或者传了 nil 值但字段不允许 NULL。 Adobe Image Background Remover Adobe推出的图片背景移除工具
相关推荐
许彰午8 小时前
14_Java泛型完全指南广州灵眸科技有限公司8 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) Easy-Eai编译环境准备与更新IT龟苓膏9 小时前
Redis 数据类型底层原理:SDS、quicklist、intset、skiplist、Bitmap、HyperLogLog 一篇讲清TechWayfarer9 小时前
IP风险等级评估接入实战:金融信贷如何用IP画像辅助风控审核Esaka_Forever9 小时前
uv init 完整用法(Python 最快包管理器)流星白龙9 小时前
【MySQL高阶】19.变更缓冲区,自适应哈希索引,日志缓冲区晴天¥9 小时前
Oracle中的监听配置与管理(动态、静态监听配置对比以及listener.ora和tnsnames.ora)瀚高PG实验室10 小时前
python连接HGDB超时闪电悠米11 小时前
黑马点评-Redisson-01_why_redissonCounter-Strike大牛11 小时前
SpringBoot2.7.10+MyBatisPlus实现MySQL+DM双数据库切换