データが返されないSQL文の実行

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

クエリが行を返す可能性がある場合は、代わりに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 予約された接続で使用します。 詳細については、接続の管理を参照してください。