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

我阅读了有关错误处理的官方指南

我应用了它

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


qq_花开花谢_0
浏览 146回答 3
3回答

慕桂英4014372

使用 pgx.ErrNoRowsif err != pgx.ErrNoRows {     fmt.Println(err)}

缥缈止盈

请修改您的问题并使其适当。重复的键值是一个有效的错误。如果要删除错误,则应避免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)

神不在的星期二

我知道这是个老问题,但我刚刚发现解决方案不要使用 var pgErr *pgconn.PgError尝试使用var pgErr pgx.PgError反而
打开App,查看更多内容
随时随地看视频慕课网APP