同じ SQL ステートメントに対して db.Exec と db.Query を交互に使用できますが、結果は異なります。 db.Exec は影響を受ける行の数を返します (ドライバーでサポートされている場合)。一方、db.Query は行オブジェクトを返します。
たとえば、DELETE ステートメントで削除された行の数をカウントするには:
res, err := db.Exec(`DELETE FROM my_table WHERE expires_at = `, time.Now()) numDeleted, err := res.RowsAffected() // Returns the number of deleted rows
別の方法 (ただし効率は下がります):
rows, err := db.Query(`DELETE FROM my_table WHERE expires_at = RETURNING *`, time.Now()) numDeleted := 0 for rows.Next() { numDeleted++ } // Iterate over deleted rows
db.Exec も次の場合に使用する必要があります。クエリ結果は必要ありません。エラー チェックのみが必要です:
if _, err := db.Exec(`<my_sql_query>`); err != nil { panic(err) }
Go が常に内部でプリペアド ステートメントを使用するというドキュメントの主張は、そうではない可能性があります。正しくありなさい。ドライバーの実装は、db.Query の呼び出しごとに新しいプリペアド ステートメントが作成されるかどうかを決定しているようです。
ただし、db.Prepare を手動で呼び出し、結果の db.Stmt をキャッシュすると、頻繁に実行されるクエリのパフォーマンスが向上します。詳細については、PostgreSQL のドキュメントを参照してください: https://www.postgresql.org/docs/current/static/sql-prepare.html
以上がGo で「db.Exec()」とプリペアドステートメントを使用する必要があるのはいつ、なぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。