データを返さないSQLステートメントの実行

データを返さないデータベース操作を実行する場合は、database/sqlパッケージのExecまたはExecContextメソッドを使用します。この方法で実行するSQLステートメントには、INSERTDELETEUPDATEなどがあります。

クエリがレコードを返す可能性がある場合は、代わりに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.Exec
DB.ExecContext
単一のSQLステートメントを個別に実行します。
Tx.Exec
Tx.ExecContext
より大きなトランザクション内でSQLステートメントを実行します。詳細については、トランザクションの実行を参照してください。
Stmt.Exec
Stmt.ExecContext
すでに準備されたSQLステートメントを実行します。詳細については、プリペアドステートメントの使用を参照してください。
Conn.ExecContext 予約済み接続での使用。詳細については、接続の管理を参照してください。