英文:
Squirrel appending "sql: " to errors, causing issues when error handling
问题
Golang项目:我正在使用Squirrel生成SQL查询,并使用pgx/stdlib作为Postgres驱动程序。我试图处理一个非常常见的错误,即ErrNoRows,基于我的一个查询,这是一个我想要优雅处理的可接受错误。问题是pgx返回的错误文本是“no rows in result set”,而Squirrel返回的是“sql: no rows in result set”,所以比较它们会失败。虽然文本相同,但Squirrel在错误前面加了前缀。处理这个问题的惯用方式是什么?我觉得截取或替换“sql: ”并不是合适的方式。
英文:
Golang project: I'm using Squirrel to generate SQL queries, and pgx/stdlib as a Postgres driver. I'm trying to account for a pretty common error, ErrNoRows, based on one of my queries, which is an acceptable error that I want to handle gracefully. The issue is pgx returns the error having text "no rows in result set", whereas Squirrel returns "sql: no rows in result set", so comparing them fails. Same text, just Squirrel is prefixing the error. What is the idiomatic way to handle this? I feel like substringing or replacing the "sql: " out isn't the appropriate way to go.
答案1
得分: 2
这是要翻译的内容:
不是database/sql
在错误前面加上了"squirrel",而是database/sql
对于sql.ErrNoRows
的定义。
由于某种原因,pgx
将ErrNoRows
定义为errors.New("no rows in result set")
。
但是,由于它是公开的,你可以在应用程序启动时执行以下操作:
pgx.ErrNoRows = sql.ErrNoRows
或者编写一个函数:
func IsErrNoRows(err error) bool {
return errors.Is(err, sql.ErrNoRows) || errors.Is(err, pgx.ErrNoRows)
}
英文:
It's not squirrel prefixing the error, that is what database/sql
has for sql.ErrNoRows
.
For some reason, pgx
does ErrNoRows = errors.New("no rows in result set")
But, since it's exported, you could just do:
pgx.ErrNoRows = sql.ErrNoRows
when your application starts up. Or write a function
func IsErrNoRows(err error) bool {
return errors.Is(err, sql.ErrNoRows) || errors.Is(err, pgx.ErrNoRows)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论