Releases: tpolecat/doobie
1.0.0-RC5
What's New
- Add module for log4cats support for debugging purposes by @sideeffffect in #1896
- Add
WeakAsync.liftIO
by @armanbilge in #1910 - Expose "unlabelled" as a constant by @jatcwang in #1946
Bug fixes and improvements
- Fix typo transcator -> transactor by @ag91 in #1931
- Fix NPE in Scala 3 derivation for Write by @jacektomaszek in #1890
- Fix future leak by @TimWSpence in #1951
- Use
syncStep
inWeakAsync.liftK
by @armanbilge in #1906 - Fix fragment helpers to handle fragments without spaces at the end (i.e. fr0, sql interpolator) by @jatcwang in #1912
- Generate return types for KleisliInterpreter methods by @jatcwang in #1929
New Contributors
- @jacektomaszek made their first contribution in #1890
- @albertpastrana made their first contribution in #1897
- @arturaz made their first contribution in #1907
- @Daenyth made their first contribution in #1928
- @ag91 made their first contribution in #1931
- @felix-hedenstrom made their first contribution in #1937
- @BenMotz made their first contribution in #1948
- @jrozanski made their first contribution in #1950
Full Changelog: v1.0.0-RC4...v1.0.0-RC5
v1.0.0-RC4
v1.0.0-RC3
Java 11 & major dependency updates
- The minimum Java version is now 11
- slf4j version is now 2.x (In order to update to latest HikariCP)
- Depends on cats-effect 3.5 & fs2 3.7
Effectful Logging & Transactor-level logging
In previous versions Doobie supports SQL statement logging via LogHandler. However, it has the slightly awkward interface of final case class LogHandler(unsafeRun: LogEvent => Unit)
which makes it difficult to integrate with pure FP logging libraries.
We have reworked how logging works, with the two major difference being:
- LogHandler now runs in an effect i.e.
def run(logEvent: LogEvent): M[Unit]
- Each
Transactor[M]
now has a singleLogHandler[M]
attached to it, in order to align the effect type.
To recover some of the previous functionality of per-query logging logic, you can call .queryWithLabel
/.updateWithLabel
(instead of .query/.update
) to attach a String
label to each query.
This label
will be set for each LogEvent, which your LogHandler
can then use to differentiate the queries being logged. (e.g. use it for metrics)
For more advanced use case where you want to pass more structured contextual information for logging purposes, you can use IOLocal
(The docs on logging has an example)
Big thanks to @oyvindberg for the implementation of effectful LogHandler and @george-wilson-rea for adding query labels
Basic migration steps
- Add a
LogHandler[M]
when constructing your Transactor (or pass a None if you don't want to log events) - Replace queryWithLogHandler/updateWithLogHandler with queryWithLabel/updateWithLabel
Tightening Postgres java.time instance typecheck
In #1735 / #1736, we tightened Meta instances for PostgreSQL java.time instances to reflect what the postgres-jdbc driver actually allows. For example, typechecking a query that tries to map a java.time.OffsetDateTime
to a VARCHAR
column in the database will now fail.
Instance for ZonedDateTime has also been removed as it is misleading (PostgreSQL does not support a timestamp type that stores the timezone)
All PostgreSQL users should migrate to using doobie.postgres.JavaTimeInstances
which has stricter type-checking to help you catch errors. For example, it enforces that the corresponding column type of an java.time.Instant
must be TIMESTAMP WITH TIME ZONE
.
Thanks @guymers!
doobie-hikari: Now automatically creates the Connect ExecutionContext
doobie.hikari.HikariTransactor#fromConfig/fromHikariConfig previously requires you to pass in a connectEC: ExecutionContext
parameter used when awaiting a connection from the hikari connection pool.
Since the general best practice is to set this fixed-size pool to your hikari connection pool size, we now automatically create this ExecutionContext for you based on hikariConfig.getMaximumPoolSize
.
If you want to use your own connectEC
like previous versions, you can use doobie.hikari.HikariTransactor#fromConfigCustomEC/fromHikariConfigCustomEC instead.
By @sideeffffect in #1690 and #1745
Improved composability and safety of fragment helpers (doobie.util.fragments.*
)
- when calling methods like
and
/or
, we now wrap the resulting expression in parenthesis.
This prevents scenarios where the boolean logic generated byand/or
can be influenced by its surroundings due to the lack of parenthesis
For example, previously the code fr"cond1 AND ${or(cond2, cond3)}"
evaluates to the SQL cond1 AND cond2 OR cond3
, which is most likely not equivalent to the user's intention of cond1 AND (cond2 OR cond3)
and will behave differently for certain cond1/2/3 values.
Basic migration steps
- Fix compile errors from
andOpt/orOpt
, which now return anOption[Fragment]
. - Carefully check use of
and/or/andOpt/orOpt
if they are used in conjunction with other AND/OR. If you were previously relying on fragment helpers NOT wrapping the resulting expression in parenthesis, you should adjust your code to maintain to old behaviour**
Other additions
- Add Semigroup and Monoid instances for ConnectionIO and friends by @Fristi in #1729
- Add weaver test framework integration by @danielkarch in #1668
- Added doobie.hikari.HikariTransactor.fromConfigAutoEc which automatically creates/configures the ExecutionContext which awaits connections from the pool, following best practices. By @sideeffffect in #1690
Binary Compatibility
v1.0.0-RC3 is NOT binary compatible
v1.0.0-RC2
New
- Enable support for derives in Scala 3 for Read, Write and Text (#1594 by @oyvindberg)
- Add support for JSON in H2 using circe (#1599 by @andrzejressel)
- Add Config case class (#1541 by @sideeffffect). This allow you to more easily configure Hikari connection pool settings using libraries like Pureconfig that relies on derivation.
- Add a cause to the munit Checker failure (#1564 by @brendanmaguire)
Fixes
- Fix effectful
copyIn
(#1512 by @oyvindberg) - Fix name of the implicit val defining the function for the Get and Write types (#1598 by @rcardin)
- Various doc fixes thanks to @andrzejressel, @LazyBun, @jatcwang, @mbablok
Removed
- Remove Quill integration (doobie-quill) #1587
v1.0.0-RC1
This is the first 1.0.0 release candidate, built on Cats-Effect 3 on the main
branch.
v0.13.4
v0.13.4 (For cats-effect 2)
Scala 3.0.0 support
Doobie is now published for Scala 3.0.0!
New integration with MUnit (doobie-munit
)
Doobie now integrates with the https://scalameta.org/munit test framework via the doobie-munit
module.
See https://tpolecat.github.io/doobie/docs/13-Unit-Testing.html on how to use it!
Big thanks to @Kazark and @alejandrohdezma for contributing this integration!
v1.0.0-M2
v0.13.1
v0.12.1
v0.12.0
This release removes Scala 3.0.0-M2 and adds Scala 3.0.0-RC1.
Note that we refer below to changes since v0.10.0. The 0.11 series was never released.
Default java.time instances for PostgreSQL in doobie.postgres.implicits._
Confusion around which date time instances to use has been a constant issues to Doobie users, and in this release we aim to make this easier.
If you're using PostgreSQL, import doobie.postgres.implicits._
will now provide you with the correct Meta
instances for java.time
types, based on pgjdbc's native support for them. You should remove any doobie.implicits.javatime
or doobie.implicits.legacy
imports as they will likely cause ambiguous implicits error.
If you're using other databases, you can keep using the current instances that you explicitly import. You can also submit a PR with a similar setup as the postgres module to make everyone life easier :)
If you see deprecation warnings about import doobie.implicits.javatime._
, you can change it to import doobie.implicits.javatimedrivernative._
(Same behaviour and instances - just a better name for clarity)
Other changes:
- Library updates.
- Fix a crash in
IOAnalysisMatchers
(Dmitry Polienko) - Make Update#apply take logHandler implicitly (Eugene Platonov)
- Add Adopters list to documentation (Eugene Platonov)
- Add postgres java.time meta instances specifically for pgjdbc driver (Jacob Wang)
- Doc improvements (Jacob Wang, Saskia Gennrich)
- Make Query#executeQuery cancelable (Michael Tkachev)
- Expose fragment internals (Rob Norris)