5

このドライバーを使用して、Go から psql と通信します。更新クエリを発行すると、実際に何かを更新したかどうかを知ることはできません (そのような ID が存在しない場合、0 行を更新できます)。

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

エラー変数を調査しようとしました(ドキュメントが 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 のスキャンに失敗します。


では、私の更新が何かを更新したかどうかを確認する標準的な方法は何ですか?

4

1 に答える 1

15

結果を返さないクエリdb.Exec()の代わりに使用してみてください。(影響を受けた行数を確認する方法がない) オブジェクトdb.Query()を返す代わりに、 method を持つオブジェクトを返します。これは、呼び出しに渡されたクエリの書き込み操作によって影響を受けた (挿入、削除、更新された) 行の数を返します。sql.Rowssql.ResultRowsAffected() (int64, error)Exec()

クエリが行に直接影響を与えず、サブクエリを介してのみ影響を与える場合、サブクエリの影響を受ける行は、そのメソッド呼び出しの影響を受ける行としてカウントされないことに注意してください。

また、メソッドのコメントにあるように、これはすべてのデータベース タイプで機能するわけではありませんが、実際にpqは、そのドライバーを自分で使用しているため (およびRowsAffected()メソッドを使用しているため)、 で機能することがわかっています。

参照リンク:

于 2016-06-14T18:37:04.610 に答える