2016-06-14 94 views
1

记录我使用this driver从去PSQL沟通。现在,当我发出更新查询时,我无法知道它是否实际更新了任何内容(如果此ID不存在,它可以更新0行)。如何检查是否PSQL成功更新围棋

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

我试图调查变量ERR(在doc提出了Insert语句的方式):

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

但是,即使不存在ID,ERR仍然是零。

我还试图用QueryRow与返回的条款:

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

但是这一次无法扫描& ID时,ID = 1是不存在于数据库中。


那么什么是规范的方式来检查我的更新是否更新了什么?

+0

[MySQL的插入浮点32和Float64转到](的相关/可能重复http://stackoverflow.com/questions/33751165/mysql -insert-FLOAT32-和float64,去) – icza

回答

5

尝试使用db.Exec()代替db.Query()对于不返回结果的查询。而不是返回sql.Rows对象(没有一种方法来检查有多少行受到影响)中,它返回一个sql.Result对象,它有一个方法RowsAffected() (int64, error)。这将返回查询中的任何写入操作(受到Exec()调用的影响(插入,删除,更新))的行数。

请注意,如果您的查询不直接影响任何行,但只能通过子查询这样做,受子查询中的行不会被算作影响该方法调用行。

此外,作为方法的评论指出,这并不对所有数据库类型的工作,但我知道它的工作原理与pq一个事实,因为我们正在使用的驱动程序自己(和使用RowsAffected()法) 。

参考链接: