データを返さないSQLステートメントの実行
データを返さないデータベース操作を実行する場合は、database/sqlパッケージのExecまたはExecContextメソッドを使用します。この方法で実行するSQLステートメントには、INSERT、DELETE、UPDATEなどがあります。
クエリがレコードを返す可能性がある場合は、代わりにQueryまたはQueryContextメソッドを使用します。詳細については、データベースのクエリを参照してください。
ExecContextメソッドは、進行中の操作のキャンセルで説明されているように、追加のcontext.Context引数を伴う点を除けば、Execメソッドと同様に機能します。
次の例のコードでは、DB.Execを使用して、新しいレコードアルバムをalbumテーブルに追加するステートメントを実行しています。
func AddAlbum(alb Album) (int64, error) {
result, err := db.Exec("INSERT INTO album (title, artist) VALUES (?, ?)", alb.Title, alb.Artist)
if err != nil {
return 0, fmt.Errorf("AddAlbum: %v", err)
}
// Get the new album's generated ID for the client.
id, err := result.LastInsertId()
if err != nil {
return 0, fmt.Errorf("AddAlbum: %v", err)
}
// Return the new album's ID.
return id, nil
}
DB.Execは、sql.Resultとエラーの値を返します。エラーがnilの場合、Resultを使用して、最後に挿入されたアイテムのID(例のように)を取得したり、操作によって影響を受けた行数を取得したりできます。
注意: プリペアドステートメントのパラメータープレースホルダーは、使用しているDBMSおよびドライバによって異なります。例えば、Postgres用のpqドライバは、?の代わりに$1のようなプレースホルダーを必要とします。
コードが同じSQLステートメントを繰り返し実行する場合、sql.Stmtを使用してSQLステートメントから再利用可能なプリペアドステートメントを作成することを検討してください。詳細については、プリペアドステートメントの使用を参照してください。
注意: fmt.Sprintfのような文字列書式設定関数を使用してSQLステートメントを組み立てないでください!SQLインジェクションのリスクが生じる可能性があります。詳細については、SQLインジェクションのリスクの回避を参照してください。
レコードを返さないSQLステートメントを実行するための関数
| 関数 | 説明 |
|---|---|
DB.ExecDB.ExecContext
|
単一のSQLステートメントを個別に実行します。 |
Tx.ExecTx.ExecContext
|
より大きなトランザクション内でSQLステートメントを実行します。詳細については、トランザクションの実行を参照してください。 |
Stmt.ExecStmt.ExecContext
|
すでに準備されたSQLステートメントを実行します。詳細については、プリペアドステートメントの使用を参照してください。 |
Conn.ExecContext
|
予約済み接続での使用。詳細については、接続の管理を参照してください。 |