使用已準備好的陳述式
您可以定義已準備好的陳述式以重複使用。這有助於您的程式碼執行得更快,因為它避免了每次程式碼執行資料庫操作時重新建立陳述式的開銷。
注意:已準備好陳述式中的參數佔位符會因您使用的 DBMS 和驅動程式而異。例如,Postgres 的 pq 驅動程式 需要一個佔位符,例如 $1
,而不是 ?
。
什麼是已準備好的陳述式?
已準備好的陳述式是 DBMS 解析並儲存的 SQL,通常包含佔位符,但沒有實際的參數值。稍後,可以使用一組參數值執行陳述式。
如何使用已準備好的陳述式
當您預期重複執行相同的 SQL 時,可以使用 sql.Stmt
預先準備 SQL 陳述式,然後視需要執行它。
以下範例建立一個已準備好的陳述式,從資料庫中選取特定專輯。 DB.Prepare
傳回一個 sql.Stmt
,代表給定 SQL 文字的已準備好陳述式。您可以將 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
|
供保留連線使用。詳情請參閱管理連線。 |