为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 golang 中的 pgx 驱动程序处理 postgres 查询错误?

如何使用 golang 中的 pgx 驱动程序处理 postgres 查询错误?

Go
qq_花开花谢_0 2022-10-24 09:27:08
我阅读了有关错误处理的官方指南我应用了它err := db.connection.QueryRow("INSERT INTO articles(uri) VALUES ($1)", article.URI).Scan()if err != nil {    var pgErr *pgconn.PgError    if errors.As(err, &pgErr) {        fmt.Println(pgErr.Message) // => syntax error at end of input        fmt.Println(pgErr.Code)    // => 42601    }}代码不起作用,我的应用程序不打印任何内容。但是postgres日志有ERROR:  duplicate key value violates unique constraint "articles_uri_key"好的,我可以使用标准的 golang 方法:err := db.connection.QueryRow("INSERT INTO articles(uri) VALUES ($1)", article.URI).Scan()if err != nil {    fmt.Println(err)}no rows in result set一个问题,它在 postgres 日志中没有错误时打印。我尝试替换 if err != nil为if err != errors.New("no rows in result set"),它仍然打印no rows in result set
查看完整描述

3 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

使用 pgx.ErrNoRows

if err != pgx.ErrNoRows {
    fmt.Println(err)}


查看完整回答
反对 回复 2022-10-24
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

请修改您的问题并使其适当。


重复的键值是一个有效的错误。如果要删除错误,则应避免duplicate进入或unique从中删除约束。


将 pgx 与 database/sql 一起使用,pgx 只是充当驱动程序sql.ErrNoRows。从 database/sql 库返回错误。pgx.ErrNoRows仅在pgx直接调用函数时返回。由于 database/sql 会从驱动程序中冒出一些错误。


sqlStatement := `

   INSERT INTO articles (uri)

    VALUES ($1)

    RETURNING id`

    id := 0

   //make sure what type of data you want to scan you should pass it inside scan()

    err = db.QueryRow(sqlStatement, article.URI).Scan(&id)

    if err != nil {

    if err == sql.ErrNoRows {   //pgx.ErrNoRows

        // there were no rows, but otherwise no error occurred

    } else {

        log.Fatal(err)

    }

}

    fmt.Println("New record ID is:", id)


查看完整回答
反对 回复 2022-10-24
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

我知道这是个老问题,但我刚刚发现解决方案不要使用

 var pgErr *pgconn.PgError

尝试使用

var pgErr pgx.PgError

反而


查看完整回答
反对 回复 2022-10-24
  • 3 回答
  • 0 关注
  • 145 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信