データベース操作

このセクションでは、データベース操作について説明します。

データベース接続を行う前にコミットのタイミングや読み書き専用などの設定を行う必要があります。

読み取り専用

読み取り専用のトランザクションを開始するには、readOnlyメソッドを使用します。

readOnlyメソッドを使用することで実行するクエリの処理を読み込み専用にすることができます。readOnlyメソッドはinsert/update/delete文でも使用することができますが、書き込み処理を行うので実行時にエラーとなります。

val read = sql"SELECT 1".query[Int].to[Option].readOnly(connection)

書き込み

書き込みを行うには、commitメソッドを使用します。

commitメソッドを使用することで実行するクエリの処理をクエリ実行時ごとにコミットするように設定することができます。

val write = sql"INSERT INTO `table`(`c1`, `c2`) VALUES ('column 1', 'column 2')".update.commit(connection)

トランザクション

トランザクションを開始するには、transactionメソッドを使用します。

transactionメソッドを使用することで複数のデータベース接続処理を1つのトランザクションにまとめることができます。

ldbcはExecutor[F, A]という形式でデータベースへの接続処理を組むことになる。 Executorはモナドなので、for内包を使って2つの小さなプログラムを1つの大きなプログラムにすることができる。

val program: Executor[IO, (List[Int], Option[Int], Int)] =
  for
    result1 <- sql"SELECT 1".query[Int].to[List]
    result2 <- sql"SELECT 2".query[Int].to[Option]
    result3 <- sql"SELECT 3".query[Int].unsafe
  yield (result1, result2, result3)

1つのプログラムとなったExecutortransactionメソッドで1つのトランザクションでまとめて処理を行うことができます。

val transaction = program.transaction(connection)