Rel8 1.8 released!

Hi folks!

We’re happy to announce the release of Rel8 1.8 ! :partying_face: Rel8 is a Haskell library for interacting with PostgreSQL databases, built on top of the fantastic Opaleye library.

The main objectives of Rel8 are:

  • Conciseness: Users using Rel8 should not need to write boiler-plate code. By using expressive types, we can provide sufficient information for the compiler to infer code whenever possible.
  • Inferrable: Despite using a lot of type level magic, Rel8 aims to have excellent and predictable type inference.
  • Familiar: writing Rel8 queries should feel like normal Haskell programming.

I would like to highlight the new TH deriving functionality. This has been a long time coming, and can give very significant compile-time improvements. In the wild, I have seen it reduce the time taken to compile a module by 80%. It doesn’t yet support all of the use-cases of Generics deriving and is somewhat experimental, so feedback is greatly appreciated!

If you encounter any issues please let us know.

Here’s the full changelog for this release:

Added

  • Added Rel8.TH.deriveRel8able and Rel8.TH.deriveRel8ables for deriving Rel8able instances using TemplateHaskell.
    This can be significantly faster than using Generics. In testing, we have seen 80% reductions in build time!

  • Expose all rel8 internal modules from the rel8-internal package.

  • Added new Conflict and Index types. Conflict represents a conflict_target in an ON CONFLICT. It can be either a named constraint (ON CONSTRAINT) or a an Index.

  • Added Index. Index is a description of a unique index which PostgreSQL can use for unique index inference. This is an alternative to specifying an explicit named constraint in a conflict_target.

  • Add notElem and notElem1 to Rel8.Array

  • Added preliminary support for PostgreSQL ranges.

  • Support GHC-9.14 and semialign >= 1.4.

  • Added notElem and notElem1 to Rel8.Array.

  • Added DBType Aeson.Object instance.

  • Bumped a variety of bounds.

Changed

  • The Upsert type was changed. Previously it had the columns (index, predicate) of what is now the Index type baked into its record. It now instead has a single conflict column (of type Conflict, which can be either an Index or a named constraint).

  • The DoNothing constructor of OnConflict was changed to also take an optional Conflict value. Even though ON CONFLICT DO NOTHING does not generally require a conflict_target, there are cases where it can be necessary, e.g., if you have table that has both deferrable and non-deferrable constraints.

  • rel8 now requires at least version 0.10.8.0 of opaleye

Fixed

  • elem and elem1 now use IS NOT DISTINCT FROM semantics (matching (==.)) when the element type is nullable, so null is found in an array containing null. Previously they were implemented with the array containment operator <@, which never matches null.

  • Fixed some issues around the truncation of long column names.

  • Improved documentation.

13 Likes