ホームページ >バックエンド開発 >Golang >Go で「db.Exec()」とプリペアドステートメントを使用する必要があるのはいつ、なぜですか?

Go で「db.Exec()」とプリペアドステートメントを使用する必要があるのはいつ、なぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-07 22:37:15965ブラウズ

When and Why Should I Use `db.Exec()` and Prepared Statements in Go?

Golang で *DB.exec() やプリペアド ステートメントを使用するのはなぜですか?

「db.Exec() を使用するのはなぜですか?」

同じ 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) }

"それとも Golang のプリペアド ステートメントですか?"

Go が常に内部でプリペアド ステートメントを使用するというドキュメントの主張は、そうではない可能性があります。正しくありなさい。ドライバーの実装は、db.Query の呼び出しごとに新しいプリペアド ステートメントが作成されるかどうかを決定しているようです。

ただし、db.Prepare を手動で呼び出し、結果の db.Stmt をキャッシュすると、頻繁に実行されるクエリのパフォーマンスが向上します。詳細については、PostgreSQL のドキュメントを参照してください: https://www.postgresql.org/docs/current/static/sql-prepare.html

以上がGo で「db.Exec()」とプリペアドステートメントを使用する必要があるのはいつ、なぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。