Squirrel给错误追加sql:前缀导致pgx ErrNoRows匹配失败如何处理
Go语言场景下的标准解决方案
Go 1.13及以上版本的标准错误处理规范明确要求不要依赖错误字符串匹配做逻辑判断,针对这类包装错误的场景,直接使用标准库errors包的errors.Is方法即可完美解决。
核心逻辑
Squirrel对底层pgx/stdlib返回的错误仅做了文本前缀追加的包装,没有破坏错误链结构,errors.Is会自动递归拆解所有外层包装的错误,直到匹配到底层的原始错误,完全不需要处理外层的错误文本内容。
代码示例
import ( "errors" "database/sql" // 其他依赖导入 ) // 你的查询逻辑 query := squirrel.Select("id", "name").From("your_table").Where("id = ?", targetId) row := query.RunWith(yourDB).QueryRow() var res YourModel err := row.Scan(&res.Id, &res.Name) if err != nil { // 直接判断是否为无数据错误,无需处理错误文本前缀 if errors.Is(err, sql.ErrNoRows) { // 此处写无数据的处理逻辑,比如返回资源不存在提示 return nil, fmt.Errorf("target resource not found") } // 其他错误的处理逻辑 return nil, err }
如果你的项目直接依赖pgx原生错误定义,也可以直接匹配pgx的错误类型:
import "github.com/jackc/pgx/v5" // ... 省略查询逻辑 ... if errors.Is(err, pgx.ErrNoRows) { // 无数据处理逻辑 }
注意事项
- 禁止使用字符串匹配、截取、替换的方式判断错误类型,这种实现强依赖第三方库的错误文本实现,一旦依赖库迭代修改错误文本,你的业务逻辑会直接失效,属于Go错误处理的反模式。
- 所有Go生态的标准库、主流第三方库的错误包装都会保留完整错误链,都可以通过
errors.Is、errors.As做类型判断,不需要依赖错误文本。
内容的提问来源于stack exchange,提问作者Redd
相关产品推荐
相关产品推荐

