Introduction to ZIO DynamoDB
Simple, type-safe, and efficient access to DynamoDB
Project Stage | CI | Release | Snapshot | Discord | Github |
---|---|---|---|---|---|
Introduction
ZIO DynamoDB is a library that is used for type-safe, efficient, and boilerplate free access to AWS's DynamoDB service. It provides a type-safe API for many query types and the number of type-safe APIs is expanding. ZIO DynamoDB will automatically batch queries and execute unbatchable queries in parallel.
Under the hood we use the excellent ZIO AWS library for type-safe DynamoDB access, and the awesome ZIO Schema library for schema derived codecs (see here for documentation on how to customise these through annotations).
Installation
To use ZIO DynamoDB, we need to add the following lines to our build.sbt
file:
libraryDependencies ++= Seq(
"dev.zio" %% "zio-dynamodb" % "0.2.4"
)
Example
For examples please see examples sbt module. Below is Main.scala
from that module:
import io.github.vigoo.zioaws.http4s
import zio.{ App, ExitCode, Has, URIO, ZLayer }
import zio.dynamodb.DynamoDBQuery.{ get, put }
import zio.dynamodb.{ DynamoDBExecutor, PrimaryKey }
import zio.schema.{ DeriveSchema, Schema }
import io.github.vigoo.zioaws.core.config
import io.github.vigoo.zioaws.dynamodb
import zio.clock.Clock
object Main extends App {
final case class Person(id: Int, firstName: String)
object Person {
implicit lazy val schema: Schema[Person] = DeriveSchema.gen[Person]
}
val examplePerson = Person(1, "avi")
private val program = for {
_ <- put("tableName", examplePerson).execute
person <- get[Person]("tableName", PrimaryKey("id" -> 1)).execute
_ <- zio.console.putStrLn(s"hello $person")
} yield ()
override def run(args: List[String]): URIO[zio.ZEnv, ExitCode] = {
val dynamoDbLayer = http4s.default >>> config.default >>> dynamodb.live // uses real AWS dynamodb
val executorLayer = (dynamoDbLayer ++ ZLayer.identity[Has[Clock.Service]]) >>> DynamoDBExecutor.live
program.provideCustomLayer(executorLayer).exitCode
}
}
For examples on how to use the DynamoDBLocal in memory database please see the integration tests and StudentZioDynamoDbExample