はじめに
レルム内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 サイトの他の関連記事を参照してください。