p
root package
package root
Package Members
- package skunk
Skunk is a functional data access layer for Postgres.
Skunk is a functional data access layer for Postgres.
Design principles:
- Skunk doesn't use JDBC. It speaks the Postgres wire protocol. It will not work with any other database back end.
- Skunk is asynchronous all the way down, via cats-effect, fs2, and ultimately nio. The
high-level network layers (
Protocol
andSession
) are safe to use concurrently. - Serialization to and from schema types is not typeclass-based, so there are no implicit derivations. Codecs are explicit, like parser combinators.
- I'm not sweating arity abstraction that much. Pass
a ~ b ~ c
for three args andVoid
if there are no args. This may change in the future but it's fine for now. - Skunk uses
Resource
for lifetime-managed objects, which means it takes some discipline to avoid leaks, especially when working concurrently. May or may not end up being problematic. - I'm trying to write good Scaladoc this time.
A minimal example follows. We construct a
Resource
that yields aSession
, then use it.package example import cats.effect._ import skunk._ import skunk.implicits._ import skunk.codec.numeric._ object Minimal extends IOApp { val session: Resource[IO, Session[IO]] = Session.single( host = "localhost", port = 5432, user = "postgres", database = "world", ) def run(args: List[String]): IO[ExitCode] = session.use { s => for { n <- s.unique(sql"select 42".query(int4)) _ <- IO(println(s"The answer is $n.")) } yield ExitCode.Success } }
Continue reading for an overview of the library. It's pretty small.
Skunk is a functional data access layer for Postgres.
Design principles:
Protocol
andSession
) are safe to use concurrently.a ~ b ~ c
for three args andVoid
if there are no args. This may change in the future but it's fine for now.Resource
for lifetime-managed objects, which means it takes some discipline to avoid leaks, especially when working concurrently. May or may not end up being problematic.A minimal example follows. We construct a
Resource
that yields aSession
, then use it.Continue reading for an overview of the library. It's pretty small.