プリペアドステートメントとは何ですか?
プリペアドステートメントは、DBMSによって解析され保存されたSQLで、通常はプレースホルダーを含みますが、実際のパラメータ値は含まれていません。後で、ステートメントは一連のパラメータ値で実行できます。
プリペアドステートメントの使用方法
同じSQLを繰り返し実行することが予想される場合、sql.Stmt
を使用してSQLステートメントを事前に準備し、必要に応じて実行できます。
次の例は、データベースから特定のアルバムを選択するプリペアドステートメントを作成します。 DB.Prepare
は、指定されたSQLテキストのためのプリペアドステートメントを表すsql.Stmt
を返します。SQLステートメントのパラメータをStmt.Exec
、Stmt.QueryRow
、またはStmt.Query
に渡してステートメントを実行できます。
// AlbumByID retrieves the specified album.
func AlbumByID(id int) (Album, error) {
// Define a prepared statement. You'd typically define the statement
// elsewhere and save it for use in functions such as this one.
stmt, err := db.Prepare("SELECT * FROM album WHERE id = ?")
if err != nil {
log.Fatal(err)
}
var album Album
// Execute the prepared statement, passing in an id value for the
// parameter whose placeholder is ?
err := stmt.QueryRow(id).Scan(&album.ID, &album.Title, &album.Artist, &album.Price, &album.Quantity)
if err != nil {
if err == sql.ErrNoRows {
// Handle the case of no rows returned.
}
return album, err
}
return album, nil
}
プリペアドステートメントの動作
プリペアドsql.Stmt
は、ステートメントを呼び出すための通常のExec
、QueryRow
、およびQuery
メソッドを提供します。これらのメソッドの使用については、データのクエリおよびデータを返さないSQLステートメントの実行を参照してください。
ただし、sql.Stmt
はすでにプリセットSQLステートメントを表しているため、そのExec
、QueryRow
、およびQuery
メソッドはプレースホルダーに対応するSQLパラメータ値のみを受け取り、SQLテキストは省略されます。
新しいsql.Stmt
を定義する方法は、使用方法によって異なります。
DB.Prepare
およびDB.PrepareContext
は、トランザクションの外で単独で実行できるプリペアドステートメントを作成します。DB.Exec
およびDB.Query
と同様です。Tx.Prepare
、Tx.PrepareContext
、Tx.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 |
予約された接続で使用します。 詳細については、 接続の管理を参照してください。 |