使用errors.Is()比较Go语言SQL错误始终返回false的问题
解决Go中使用errors.Is()比较pgx SQL错误始终返回false的问题
问题根源
你遇到的核心问题是:自定义的ErrNoRows和pgx库内部抛出的"no rows in result set"错误并非同一实例,哪怕错误文本完全一致,errors.Is()也会返回false——因为这个方法的匹配逻辑是检查错误链中是否存在目标错误的完全相同的实例,而非比较错误字符串内容。
正确解决方案
直接使用pgx库官方提供的错误常量pgx.ErrNoRows来判断,无需自行定义:
import ( "github.com/jackc/pgx/v5" ) // 执行查询并判断错误 err := tx.QueryRow(ctx, sqlstmt).Scan(&myvar) if errors.Is(err, pgx.ErrNoRows) { // 处理无查询结果的逻辑 }
自定义ErrNoRows不生效的原因
你通过errors.New("no rows in result set")创建的错误变量是全新实例,而pgx库在查询无结果时抛出的是它内部预定义的pgx.ErrNoRows实例。这两个实例虽字符串内容相同,但内存中是独立对象,errors.Is()无法完成匹配。
errors.Is()的设计初衷是匹配同一错误实例(或通过errors.As()匹配错误类型),而非做字符串相等性校验。因此必须使用库本身提供的错误常量,才能确保匹配成功。
内容的提问来源于stack exchange,提问作者Mopparthy Ravindranath
相关产品推荐
相关产品推荐

