2016-06-14 4 views
1

私はthis driverを使ってGoからpsqlと通信します。今、私が更新クエリを発行するとき、実際に何かを更新したかどうかを知ることはできません(idが存在しない場合は0行を更新できます)。PsqlがGoでレコードを正常に更新したかどうかを確認するには

_, 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) 

しかし、この1 = 1 idはデータベースに存在しない場合& IDをスキャンするために失敗しました。


だから私の更新は何を更新するかどうかをチェックするための標準的な方法は何ですか?

+0

可能/関連複製(http://stackoverflow.com/questions/33751165/mysql -insert-float32-and-float64-go) – icza

答えて

5

結果が返されないクエリの場合は、db.Query()の代わりにdb.Exec()を使用してください。 sql.Rowsオブジェクト(返される行の数を確認する方法がない)を返す代わりに、sql.Resultオブジェクトを返します。このオブジェクトには、RowsAffected() (int64, error)というメソッドがあります。これにより、Exec()コールに供給されたクエリの書き込み操作によって影響を受ける(挿入、削除、更新された)行の数が返されます。

クエリが行に直接影響を与えず、サブクエリを介してのみ行に影響する場合、サブクエリの影響を受ける行はそのメソッド呼び出しの影響を受ける行として数えられません。

また、メソッドのコメントのメモとして、これはすべてのデータベース・タイプには使用できませんが、我々はそのドライバ自身を使用して(とRowsAffected()メソッドを使用して)しているように私は、それがpqで動作するという事実を知っています。

参考リンク:[MySQLの挿入のfloat32とのfloat64移動]の

関連する問題