コンテキスト
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)
}
}