🥰

Scala で DynamoDB の読み書き

2023/10/04に公開

scanamo を使って Scala で DynamoDB を読み書きするサンプル.

//> using scala "3.3.1"
//> using dep "org.scanamo::scanamo:1.0.0-M25"

import org.scanamo.Scanamo
import org.scanamo.Table
// serial_id === "..." のように文字列で predicate を書くためのおまじない
import org.scanamo.syntax.*
import org.scanamo.generic.auto.*

case class Record(name: String, id: Long, memo: String)

@main
def run =
  // Table[T](name: String) は org.scanamo.DynamoFormat 型のインスタンスを受け取る.
  // このインスタンスの実装に応じて DynamoDB と JVM の型のシリアライズ・デシリアライズが決まる.
  // org.scanamo.generic.auto.* をインポートすることで自動で DynamoFormat インスタンスが導出される.
  val table = Table[Record]("dynamodbのtable名")
  
  val record = Record("example", 0L, "nope")
  // 同期的にリクエストを送るクライアントと 
  // ScanamoCats など非同期にリクエストを送るクライアントが存在する.
  // 利用時は aws の dynamodb クライアントのインスタンスを渡して初期化する.
  
  val client = Scanamo(???)
  
  // 変更やクエリのアクションを定義して、それを client に実行させるメンタルモデル
  
  val writeAction = table.putAll(Set(record))
  
  client.exec(writeAction)
  
  // 読み込み側
  val readAction = table.get("name" === "example")
  
  val result = client.exec(readAction)
  
  val Some(Right(data)) = result: @unchecked

Discussion