我使用 this driver从 Go 与 psql 通信。现在,当我发出更新查询时,我无法知道它是否实际更新了任何内容(如果不存在此类 ID,它可以更新 0 行)。
_, err := Db.Query("UPDATE tags SET name=$1 WHERE id=1", name)
我试图调查 err 变量(按照文档建议的 Insert 语句的方式):
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。
那么检查我的更新是否更新任何内容的规范方法是什么?
最佳答案
对于不返回结果的查询,请尝试使用 db.Exec()
而不是 db.Query()
。它没有返回 sql.Rows
对象(无法检查受影响的行数),而是返回一个 sql.Result
对象,该对象具有方法 RowsAffected()(int64,错误)
。这将返回受馈送到 Exec()
调用的查询中的任何写入操作影响(插入、删除、更新)的行数。
res, err := db.Exec(query, args...)
if err != nil {
return err
}
n := res.RowsAffected()
// do something with n
请注意,如果您的查询不直接影响任何行,而只是通过子查询影响行,则受子查询影响的行将不会被计为受该方法调用影响的行。
此外,正如方法注释所指出的,这不适用于所有 数据库类型,但我知道它确实适用于 pq
,因为我们我们自己使用该驱动程序(并使用 RowsAffected()
方法)。
引用链接:
关于go - 如何查看Psql是否成功更新了Go中的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37818970/