如何在Go中检查Psql是否成功更新了记录

8

我使用这个驱动程序从Go中与psql通信。现在,当我发出更新查询时,我无法知道它是否实际上更新了任何内容(如果不存在此ID,则可以更新0行)。

_, err := Db.Query("UPDATE tags SET name=$1 WHERE id=1", name)

我尝试按照文档中Insert语句的建议去调查err变量:

if err == sql.ErrNoRows {
    ...
}

即使id不存在,err仍然是null。

我还尝试使用带返回语句的QueryRow:

id := 0
err := Db.QueryRow("UPDATE tags SET name=$1 WHERE id=1 RETURNING id", name).Scan(&id)

但是当数据库中不存在id=1时,此代码不能扫描到&id。


那么检查我的更新是否有更新任何内容的规范方式是什么?


相关 / 可能是 MySQL Insert Float32 and Float64 Go 的重复问题。 - icza
1个回答

18

尝试使用db.Exec()而不是db.Query()来查询不返回结果的内容。它不会返回一个sql.Rows对象(该对象没有办法检查受影响的行数),而是返回一个sql.Result对象,该对象有一个方法RowsAffected() (int64, error)。这个方法返回在传递给Exec()调用的查询中任何写操作所影响的行数(插入、删除、更新)。

res, err := db.Exec(query, args...)
if err != nil {
    return err
}

n, err := res.RowsAffected()
if err != nil {
    return err
}
// do something with n

请注意,如果您的查询没有直接影响任何行,而只是通过子查询间接影响了行,则由子查询影响的行不会计入该方法调用的受影响行数。
此外,正如方法注释所述,这并不适用于所有数据库类型,但我知道它确实适用于 pq,因为我们自己正在使用该驱动程序(并使用 RowsAffected() 方法)。
参考链接:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接