Go Prepared Statement:ガイドと例
Emily Parker
Product Engineer · Leapcell

Goでは、database/sql
パッケージがプリペアドステートメントの堅牢なサポートを提供しており、これは同じSQLステートメントを複数回効率的かつ安全に実行するのに役立ちます。プリペアドステートメントは、SQLインジェクション攻撃を防ぎ、データベースが繰り返しクエリの実行計画を最適化できるようにすることで、パフォーマンスを向上させることができます。
Key Takeaways
- プリペアドステートメントは、SQLインジェクションを防ぐことでセキュリティを向上させます。
- 繰り返し使用するためにクエリ実行を最適化することで、パフォーマンスを向上させます。
- 適切なリソース管理(ステートメントのクローズ、エラー処理)が不可欠です。
プリペアドステートメントとは?
プリペアドステートメントは、異なるパラメータで複数回実行できる、事前にコンパイルされたSQLステートメントです。このアプローチは、SQLロジックをデータから分離し、セキュリティとパフォーマンスを向上させます。
Goでプリペアドステートメントを使用する
-
必要なパッケージをインポートする
必要なパッケージをインポートすることから始めます。
import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" // MySQL driver )
-
データベース接続を確立する
sql.Open
を使用してデータベースへの接続を作成します。sql.Open
はすぐに接続を確立するのではなく、将来の使用のためにデータベースハンドルを準備することに注意してください。db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname") if err != nil { // エラー処理 panic(err) } defer db.Close()
-
ステートメントを準備する
Prepare
メソッドを使用して、プリペアドステートメントを作成します。このメソッドはsql.Stmt
オブジェクトを返し、これは異なるパラメータで複数回実行できます。stmt, err := db.Prepare("INSERT INTO users(name, age) VALUES(?, ?)") if err != nil { // エラー処理 panic(err) } defer stmt.Close()
この例では、
?
は実行時に提供されるパラメータのプレースホルダーとして機能します。正確なプレースホルダーの構文は、使用されるデータベースドライバによって異なる場合があります。たとえば、PostgreSQLは$1
、$2
などをプレースホルダーとして使用します。(go.dev) -
プリペアドステートメントを実行する
Exec
メソッドを使用して、異なるパラメータセットでプリペアドステートメントを実行します。_, err = stmt.Exec("Alice", 30) if err != nil { // エラー処理 panic(err) } _, err = stmt.Exec("Bob", 25) if err != nil { // エラー処理 panic(err) }
Exec
の各呼び出しは、提供されたパラメータでプリペアドステートメントを実行します。 -
プリペアドステートメントでデータをクエリする
プリペアドステートメントは、データのクエリにも使用できます。プリペアドステートメントを使用してデータを取得する方法の例を次に示します。
queryStmt, err := db.Prepare("SELECT id, name, age FROM users WHERE age > ?") if err != nil { // エラー処理 panic(err) } defer queryStmt.Close() rows, err := queryStmt.Query(20) if err != nil { // エラー処理 panic(err) } defer rows.Close() for rows.Next() { var id int var name string var age int err = rows.Scan(&id, &name, &age) if err != nil { // エラー処理 panic(err) } fmt.Printf("ID: %d, Name: %s, Age: %d\n", id, name, age) } if err = rows.Err(); err != nil { // エラー処理 panic(err) }
この例では、プリペアドステートメントは、指定された年齢よりも年上のすべてのユーザーを選択するために使用されます。
Query
メソッドはステートメントを実行し、結果はrows.Next()
を使用して反復処理されます。各行の列は、Scan
メソッドを使用して変数に読み込まれます。
FAQs
SQLインジェクションを防ぎ、実行計画を再利用することでパフォーマンスを向上させます。
はい、INSERT
、UPDATE
、DELETE
、およびSELECT
操作に使用できます。
リソースリークや不要なデータベース負荷につながる可能性があります。
ベストプラクティス
-
ステートメントを閉じる:データベースリソースを解放するために、常に
stmt.Close()
を使用してプリペアドステートメントを閉じます。ステートメントの準備直後にdefer stmt.Close()
を使用すると、不要になったときに閉じられることが保証されます。 -
エラー処理:データベース操作中に発生する可能性のある問題をキャッチして管理するために、堅牢なエラー処理を実装します。
-
接続管理:
sql.DB
は接続のプールを管理することを忘れないでください。特に同じステートメントを複数回実行するアプリケーションでは、ステートメントを一度準備して再利用するのが効率的です。
これらの手順とベストプラクティスに従うことで、Goでプリペアドステートメントを効果的に利用して、安全で効率的なデータベースアプリケーションを作成できます。
Goプロジェクトのホスティングには、Leapcellをお選びください。
Leapcellは、ウェブホスティング、非同期タスク、Redisのための次世代サーバーレスプラットフォームです。
多言語サポート
- Node.js、Python、Go、またはRustで開発。
無制限のプロジェクトを無料でデプロイ
- 使用量に応じてのみ支払い — リクエストなし、請求なし。
比類なき費用対効果
- アイドル料金なしの従量課金制。
- 例:25ドルで平均応答時間60ミリ秒で694万リクエストをサポート。
合理化された開発者エクスペリエンス
- 簡単なセットアップのための直感的なUI。
- 完全に自動化されたCI/CDパイプラインとGitOps統合。
- 実用的な洞察のためのリアルタイムのメトリクスとロギング。
簡単なスケーラビリティと高性能
- 高い同時実行性を容易に処理するための自動スケーリング。
- 運用上のオーバーヘッドはゼロ — 構築に集中するだけ。
詳細については、ドキュメントをご覧ください。
Xでフォローしてください:@LeapcellHQ