Skip to main content
Version: 2.x

Getting Started with Quill

Scastie is a great tool to try out Quill without having to prepare a local environment. It works with mirror contexts, see this snippet as an example.

Quill has integrations with many libraries. If you are using a regular RDBMS e.g. PostgreSQL and want to use Quill to query it with an asynchronous, non-blocking, reactive application, the easiest way to get started is by using ZIO.

A simple ZIO + Quill application looks like this:

case class Person(name: String, age: Int)

class DataService(quill: Quill.Postgres[SnakeCase]) {
import quill._
def getPeople: ZIO[Any, SQLException, List[Person]] = run(query[Person])
}
object DataService {
def getPeople: ZIO[DataService, SQLException, List[Person]] =
ZIO.serviceWithZIO[DataService](_.getPeople)

val live = ZLayer.fromFunction(new DataService(_))
}
object Main extends ZIOAppDefault {
override def run = {
DataService.getPeople
.provide(
DataService.live,
Quill.Postgres.fromNamingStrategy(SnakeCase),
Quill.DataSource.fromPrefix("myDatabaseConfig")
)
.debug("Results")
.exitCode
}
}

Add the following to build.sbt:

libraryDependencies ++= Seq(
"io.getquill" %% "quill-jdbc-zio" % "4.8.4",
"org.postgresql" % "postgresql" % "42.3.1"
)

You can find this code (with some more examples) complete with a docker-provided Postgres database here. A variety of other examples using Quill with ZIO are available in the examples folder.

Choosing a Module

Choose the quill module that works for you!

  • If you are starting from scratch with a regular RDBMS try using the quill-jdbc-zio module as shown above.
  • If you are developing a legacy Java project and don't want/need reactive, use quill-jdbc.
  • If you are developing a project with Cats and/or Monix, try quill-jdbc-monix.
  • If you are using Cassandra, Spark, or OrientDB, try the corresponding modules for each of them.