英文:
How to handle postgres query error with pgx driver in golang?
问题
我阅读了这个关于错误处理的官方指南,并进行了应用。
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
。
英文:
I read this official guide about error handling
i applied it
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
}
}
Code doesn't work, my app doens't print anything. But postgres log has ERROR: duplicate key value violates unique constraint "articles_uri_key"
Ok, i can use standart golang method:
err := db.connection.QueryRow("INSERT INTO articles(uri) VALUES ($1)", article.URI).Scan()
if err != nil {
fmt.Println(err)
}
One problem, it prints no rows in result set
when no errors in postgres log.
I tried replace
if err != nil
with if err != errors.New("no rows in result set")
,
it still prints no rows in result set
答案1
得分: 1
使用pgx.ErrNoRows
if err != pgx.ErrNoRows {
fmt.Println(err)
}
英文:
Use pgx.ErrNoRows
if err != pgx.ErrNoRows {
fmt.Println(err)
}
答案2
得分: 1
请修改你的问题,使其合适。
重复键值是一个有效的错误。如果你想要移除这个错误,你可以避免重复的条目,或者移除它的唯一约束。
在使用pgx和database/sql时,pgx只是作为驱动程序。sql.ErrNoRows
错误是从database/sql库返回的。只有在直接调用pgx
函数时才会返回pgx.ErrNoRows
。因为database/sql会从驱动程序中传递一些错误。
sqlStatement := `
INSERT INTO articles (uri)
VALUES ($1)
RETURNING id`
id := 0
//确保你想要扫描的数据类型应该传递到scan()函数中
err = db.QueryRow(sqlStatement, article.URI).Scan(&id)
if err != nil {
if err == sql.ErrNoRows { //pgx.ErrNoRows
//没有行,但没有发生其他错误
} else {
log.Fatal(err)
}
}
fmt.Println("New record ID is:", id)
为了更好地理解或处理多行,请参考此链接:https://stackoverflow.com/questions/70208076/how-to-get-row-values-back-after-db-insert/70209795#70209795
英文:
Please modify your question and make it appropriate.
Duplicate key value is a valid error. If you want to remove the error either you should avoid duplicate
entry or remove unique
constraint from it.
Using pgx with database/sql, pgx is simply acting as driver.The sql.ErrNoRows
error is being returned from the database/sql library. pgx.ErrNoRows
is only returned when calling a pgx
function directly. As database/sql will bubble up some errors from the driver.
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)
For better understanding or for multiple rows please refer this link : https://stackoverflow.com/questions/70208076/how-to-get-row-values-back-after-db-insert/70209795#70209795
答案3
得分: 0
我知道这是一个旧问题,但我刚刚找到了解决方案。不要使用var pgErr *pgconn.PgError
,而是尝试使用var pgErr pgx.PgError
。
英文:
I know it's old question, but I just found the solution
do not use
var pgErr *pgconn.PgError
try to use
var pgErr pgx.PgError
instead
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论