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推出的图片背景移除工具
相关推荐
Decay__11 小时前
12_MySQL InnoDB 内存与锁调优 —— Buffer Pool、redo log、隔离级别与锁等待笃行35011 小时前
AI数据库的库内四层结构,KingbaseES 产品拆解我是大猴子13 小时前
redis卷无止境15 小时前
RAGFlow 项目全景报告:从文档解析引擎到 Agent 原生数据库苏宸啊15 小时前
MySQL(一)2603_9696948515 小时前
JDBC 基础学习笔记:API 核心原理解析与 CRUD 代码实操这个DBA有点耶16 小时前
库内语义构建 vs 外挂向量库:业务语义缺失,才是RAG“胡说八道”的根源灿飞屋16 小时前
Kotlin与Java虚拟机三:控制流benchmark_cc16 小时前
单只股票五档盘口接入个人研究仓库:QuantDash 读取、校验与易错点kobe_OKOK_17 小时前
mysql 开启 binlog 日志