プリペアドステートメントとは何ですか?

プリペアドステートメントは、DBMSによって解析され保存されたSQLで、通常はプレースホルダーを含みますが、実際のパラメータ値は含まれていません。後で、ステートメントは一連のパラメータ値で実行できます。

プリペアドステートメントの使用方法

同じSQLを繰り返し実行することが予想される場合、sql.Stmtを使用してSQLステートメントを事前に準備し、必要に応じて実行できます。

次の例は、データベースから特定のアルバムを選択するプリペアドステートメントを作成します。 DB.Prepareは、指定されたSQLテキストのためのプリペアドステートメントを表すsql.Stmtを返します。SQLステートメントのパラメータをStmt.ExecStmt.QueryRow、またはStmt.Queryに渡してステートメントを実行できます。

  1. // AlbumByID retrieves the specified album.
  2. func AlbumByID(id int) (Album, error) {
  3. // Define a prepared statement. You'd typically define the statement
  4. // elsewhere and save it for use in functions such as this one.
  5. stmt, err := db.Prepare("SELECT * FROM album WHERE id = ?")
  6. if err != nil {
  7. log.Fatal(err)
  8. }
  9. var album Album
  10. // Execute the prepared statement, passing in an id value for the
  11. // parameter whose placeholder is ?
  12. err := stmt.QueryRow(id).Scan(&album.ID, &album.Title, &album.Artist, &album.Price, &album.Quantity)
  13. if err != nil {
  14. if err == sql.ErrNoRows {
  15. // Handle the case of no rows returned.
  16. }
  17. return album, err
  18. }
  19. return album, nil
  20. }

プリペアドステートメントの動作

プリペアドsql.Stmtは、ステートメントを呼び出すための通常のExecQueryRow、およびQueryメソッドを提供します。これらのメソッドの使用については、データのクエリおよびデータを返さないSQLステートメントの実行を参照してください。

ただし、sql.StmtはすでにプリセットSQLステートメントを表しているため、そのExecQueryRow、およびQueryメソッドはプレースホルダーに対応するSQLパラメータ値のみを受け取り、SQLテキストは省略されます。

新しいsql.Stmtを定義する方法は、使用方法によって異なります。

  • DB.PrepareおよびDB.PrepareContextは、トランザクションの外で単独で実行できるプリペアドステートメントを作成します。DB.ExecおよびDB.Queryと同様です。
  • Tx.PrepareTx.PrepareContextTx.Stmt、およびTx.StmtContextは、特定のトランザクションで使用するためのプリペアドステートメントを作成します。PrepareおよびPrepareContextは、SQLテキストを使用してステートメントを定義します。StmtおよびStmtContextは、DB.PrepareまたはDB.PrepareContextの結果を使用します。つまり、トランザクション用でないsql.Stmtをこのトランザクション用のsql.Stmtに変換します。
  • Conn.PrepareContextは、予約された接続を表すsql.Connからプリペアドステートメントを作成します。

コードがステートメントを終了したときにstmt.Closeが呼び出されることを確認してください。これにより、関連する可能性のあるデータベースリソース(基盤となる接続など)が解放されます。関数内のローカル変数としてのみ存在するステートメントの場合、defer stmt.Close()で十分です。

プリペアドステートメントを作成するための関数

関数 説明
DB.Prepare
DB.PrepareContext
実行のためにステートメントを準備します。
隔離またはTx.Stmtを使用してトランザクション内に変換されるステートメント。
Tx.Prepare
Tx.PrepareContext
Tx.Stmt
Tx.StmtContext
特定のトランザクションで使用するためのステートメントを準備します。詳細については、
トランザクションの実行を参照してください。
Conn.PrepareContext 予約された接続で使用します。
詳細については、
接続の管理を参照してください。