go - 如何查看Psql是否成功更新了Go中的记录

标签 go pq

我使用 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/

相关文章:

c++ - C++ 中的 golang 样式 "defer"

go - 为什么这个零长度和零容量 slice 不为零?

postgresql - 去模拟 postgresql 错误

postgresql - PostgreSQL和Golang之间的数据类型

authentication - Golang HTTP 基本认证

go - main 只是一个普通的 goroutine 吗?

go - 为什么 gmail API 以纯文本形式发送 html 电子邮件?

go - 库/pq : Runtime error when querying a database

postgresql - 多行的 Golang 慢速扫描()

postgresql - 从特定函数创建通用函数(重构)