コンテキスト

Go標準ライブラリのdatabase/sqlパッケージを利用して、DB操作のコンテキスト(Context)を指定する方法を説明します。

Contextを使ったDB操作の方法

Contextは処理のキャンセルやタイムアウトをするための仕組みです。

DBアクセスでContextを使うには、これまで利用してきたメソッド名の末尾に 『Context』をつけたメソッドを利用します。 これらのメソッドは第一引数にContextを渡せることを除けば、 これまでのと同じように利用できます。

// Ping
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
{
    ctx, cancel := context.WithTimeout(ctx, 1*time.Second)
    defer cancel()
    if err := db.PingContext(ctx); err != nil {
        log.Fatal(err)
    }
}
// Exec
{
    ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
    defer cancel()

    _, err := db.ExecContext(ctx, "select 1;")
    if err != nil {
        log.Fatal(err)
    }
}
// トランザクション
{
    ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
    defer cancel()

    tx, err := db.Begin()
    if err != nil {
        log.Fatal(err)
    }

    sqlIns := `INSERT INTO tasks(name, status) VALUES (?, ?);`
    if _, err = tx.ExecContext(ctx, sqlIns, "task1", "open"); err != nil {
        tx.Rollback()
        log.Fatal(err)
    }
    if err := tx.Commit(); err != nil {
        log.Fatal(err)
    }
}