データが返されないSQL文の実行
データを返さないデータベース操作を実行する場合は、database/sql
パッケージのExec
またはExecContext
メソッドを使用します。 この方法で実行するSQL文には、INSERT
、DELETE
、UPDATE
などがあります。
クエリが行を返す可能性がある場合は、代わりにQuery
またはQueryContext
メソッドを使用します。 詳細については、データベースのクエリを参照してください。
ExecContext
メソッドは、Exec
メソッドと同様に機能しますが、進行中の操作のキャンセルで説明されているように、追加のcontext.Context
引数を使用します。
次の例のコードは、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.Exec DB.ExecContext
|
単一のSQL文を単独で実行します。 |
Tx.Exec Tx.ExecContext
|
より大きなトランザクション内でSQL文を実行します。 詳細については、トランザクションの実行を参照してください。 |
Stmt.Exec Stmt.ExecContext
|
既に準備されているSQL文を実行します。 詳細については、プリペアドステートメントの使用を参照してください。 |
Conn.ExecContext
|
予約された接続で使用します。 詳細については、接続の管理を参照してください。 |