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

我读了这个 official guide about error handling

我应用了它

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)
}

一个问题是,当 postgres 日志中没有错误时,它会打印 no rows in result set

我尝试用 if err != nil 替换 if err != errors.New("no rows in result set")

它仍然打印 no rows in result set

stack overflow How to handle postgres query error with pgx driver in golang?
原文答案

答案:

作者头像

使用 pgx.ErrNoRows

if err != pgx.ErrNoRows {
    fmt.Println(err)
}
作者头像

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

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

将 pgx 与 database/sql 一起使用,pgx 只是充当驱动程序。从 database/sql 库返回 sql.ErrNoRows 错误。 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)

为了更好地理解或多行,请参阅此链接: How to get row value(s) back after db insert?

作者头像

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

 var pgErr *pgconn.PgError

尝试使用

var pgErr pgx.PgError

反而