ホームページ > バックエンド開発 > Golang > 結果行のないクエリには、Go で「DB.exec()」またはプリペアドステートメントを使用する必要がありますか?

結果行のないクエリには、Go で「DB.exec()」またはプリペアドステートメントを使用する必要がありますか?

Susan Sarandon
リリース: 2024-12-12 22:42:30
オリジナル
383 人が閲覧しました

Should I Use `DB.exec()` or Prepared Statements in Go for Queries Without Result Rows?

Golang で *DB.exec() とプリペアド ステートメントを使用するという難問を解読する

はじめに

レルム内Go と Postgresql を使用したデータベース操作について、いつまでも疑問が残ります。なぜわざわざこれを行う必要があるのか​​ということです。 DB.exec() または Go が作成を自動化しているように見えるプリペアド ステートメントですか?この記事では、行を返さない操作の実行の複雑さを掘り下げ、プリペアド ステートメントの使用の背後にある理論的根拠を説明します。

なぜ DB.exec() を使用するのか?

DB.Query() は事実ですが、 DB.exec() は、SQL ステートメントを実行するために同じ意味で使用できますが、返される結果のタイプが異なります。 DB.exec() はクエリの影響を受ける行数に関する洞察を提供しますが、DB.Query() は結果セットを返します。

たとえば、次のようにします。 DELETE ステートメントを実行して、削除された行の数を確認したいとします。 DB.exec() を使用することが推奨されるアプローチです。

res, err := db.Exec(`DELETE FROM my_table WHERE expires_at = `, time.Now())
if err != nil {
    panic(err)
}

numDeleted, err := res.RowsAffected()
if err != nil {
    panic(err)
}
print(numDeleted)
ログイン後にコピー

または、より面倒なアプローチでは、DB.Query() を使用し、それらをカウントする行:

rows, err := db.Query(`DELETE FROM my_table WHERE expires_at =  RETURNING *`, time.Now())
if err != nil {
    panic(err)
}
defer rows.Close()

var numDeleted int
for rows.Next() {
    numDeleted += 1
}
if err := rows.Err(); err != nil {
    panic(err)
}
print(numDeleted)
ログイン後にコピー

さらに、クエリの結果が無関係で、単に必要な場合それを実行すると、DB.exec() が簡潔な解決策を提供します。

if _, err := db.Exec(`<my_sql_query>`); err != nil {
    panic(err)
}
ログイン後にコピー

対照的に、返された DB.Rows 値のクローズ呼び出しを省略します。 DB.Query() を使用すると、最終的にメモリによるオープン接続の過負荷が発生します。

プリペアド ステートメントの詳細

Go はプリペアド ステートメントを自動的に作成すると示唆されていますが、実際はさらに微妙なようです。 DB.Query() の動作は、使用されている基礎となるドライバーに依存しているようです。

にもかかわらず、DB.Stmt を準備して再利用すると、頻繁に実行されるパフォーマンスを向上させることができます。クエリ。 Postgresql の公式ドキュメントを参照すると、プリペアド ステートメントがどのように操作を最適化できるかがわかります。

結論

DB.exec()

DB.exec() の違いを理解するGolang のプリペアド ステートメントは、開発者が行を返さない操作を効率的に実行し、パフォーマンスを求めるときにプリペアド ステートメントの利点を活用するのに役立ちます。最適化。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート