Hi folks!
We’re happy to announce the release of Rel8 1.8 !
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.deriveRel8ableandRel8.TH.deriveRel8ablesfor derivingRel8ableinstances usingTemplateHaskell.
This can be significantly faster than usingGenerics. In testing, we have seen 80% reductions in build time! -
Expose all
rel8internal modules from therel8-internalpackage. -
Added new
ConflictandIndextypes.Conflictrepresents aconflict_targetin anON CONFLICT. It can be either a named constraint (ON CONSTRAINT) or a anIndex. -
Added
Index.Indexis 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 aconflict_target. -
Add
notElemandnotElem1toRel8.Array -
Added preliminary support for PostgreSQL ranges.
-
Support GHC-9.14 and
semialign >= 1.4. -
Added
notElemandnotElem1toRel8.Array. -
Added
DBType Aeson.Objectinstance. -
Bumped a variety of bounds.
Changed
-
The
Upserttype was changed. Previously it had the columns (index,predicate) of what is now theIndextype baked into its record. It now instead has a singleconflictcolumn (of typeConflict, which can be either anIndexor a named constraint). -
The
DoNothingconstructor ofOnConflictwas changed to also take an optionalConflictvalue. Even thoughON CONFLICT DO NOTHINGdoes not generally require aconflict_target, there are cases where it can be necessary, e.g., if you have table that has both deferrable and non-deferrable constraints. -
rel8now requires at least version0.10.8.0ofopaleye
Fixed
-
elemandelem1now useIS NOT DISTINCT FROMsemantics (matching(==.)) when the element type is nullable, sonullis found in an array containingnull. Previously they were implemented with the array containment operator<@, which never matchesnull. -
Fixed some issues around the truncation of long column names.
-
Improved documentation.