0

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

我应用了它

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 != nilif err != errors.New("no rows in result set"),

它仍然打印no rows in result set

4

2 回答 2

0

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

重复的键值是一个有效的错误。如果要删除错误,则应避免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)

为了更好地理解或多行,请参阅此链接:数据库插入后如何获取行值?

于 2021-12-29T07:28:58.440 回答
0

使用 pgx.ErrNoRows

if err != pgx.ErrNoRows {
    fmt.Println(err)
}
于 2021-12-29T07:18:11.380 回答