rel8
Hey! Hey! Can u rel8?
https://github.com/circuithub/rel8
| Version on this page: | 1.4.1.0 |
| LTS Haskell 21.25: | 1.4.1.0 |
| Stackage Nightly 2025-11-07: | 1.7.0.0 |
| Latest on Hackage: | 1.7.0.0 |
rel8-1.4.1.0@sha256:84e20d00567be72ca6944e5df5ed0fb00fdaf95f046f4cec633b870319a2fbaf,5264Module documentation for 1.4.1.0
Welcome!
Welcome to Rel8! 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.
Rel8 was presented at ZuriHac 2021. If you want to have a brief overview of what Rel8 is, and a tour of the API - check out the video below:
For more details, check out the official documentation.
Changes
1.4.1.0 (2023-01-19)
New features
- Rel8 now supports window functions. See the “Window functions” section of the
Rel8module documentation for more details. (#182) Querynow hasMonoidandSemigroupinstances. (#207)createOrReplaceViewhas been added (to runCREATE OR REPLACE VIEW). (#209 and #212)deriving Rel8ablenow supports more polymorphism. (#215)- Support GHC 9.4 (#199)
Bug fixes
- Insertion of
DEFAULTvalues has been fixed. (#206) - Avoid some exponential SQL generation in
Rel8.Tabulate.alignWith. (#213) nextValhas been fixed to work with case-sensitive sequence names. (#217)
Other
- Correct the documentation for “Supplying
Rel8ableinstances” (#200) - Removed some redundant internal code (#202)
- Rel8 is now less dependant on the internal Opaleye API. (#204)
1.4.0.0 (2022-08-17)
Breaking changes
- The behavior of
greatest/leasthas been corrected, and was previously flipped. (#183)
New features
NullTable/HNullhave been added. This is an alternative toMaybeTablethat doesn’t use a tag columns. It’s less flexible (noFunctororApplicativeinstance) and is meaningless when used with a table that has no non-nullable columns (so nestingNullTableis redundant). But in situations where the underlyingTabledoes have non-nullable columns, it can losslessly converted to and fromMaybeTable. It is useful for embedding into a base table when you don’t want to store the extra tag column in your schema. (#173)- Add
fromMaybeTable. (#179) - Add
alignMaybeTable. (#196)
Improvements
- Optimize implementation of
AltTableforTabulation(#178)
Other
- Documentation improvements for
HADT. (#177) - Document example usage of
groupBy. (#184) - Build with and require Opaleye >= 0.9.3.3. (#190)
- Build with
hasql1.6. (#195)
1.3.1.0 (2022-01-20)
Other
- Rel8 now requires Opaleye >= 0.9.1. (#165)
1.3.0.0 (2022-01-31)
Breaking changes
divandmodhave been changed to match Haskell semantics. If you need the PostgreSQLdiv()andmod()functions, usequotandrem. While this is not an API change, we feel this is a breaking change in semantics and have bumped the major version number. (#155)
New features
divModandquotRemfunctions have been added, matching Haskell’sPreludefunctions. (#155)avgandmodeaggregation functions to find the mean value of an expression, or the most common row in a query, respectively. (#152)- The full
EqTableandOrdTableclasses have been exported, allowing for instances to be manually created. (#157) - Added
likeandilike(for theLIKEandILIKEoperators). (#146)
Other
- Rel8 now requires Opaleye 0.9. (#158)
- Rel8’s test suite supports Hedgehog 1.1. (#160)
- The documentation for binary operations has been corrected. (#162)
1.2.2.0 (2021-11-21)
Other
1.2.1.0 (2021-11-21)
New features
-
castTablehas been added, which casts all columns selected from inQueryaccording to the types of columns. This can occasionally be useful when usingmany/someon older PostgreSQL versions. (#137) -
Added
<:,<=:,>:,>=:,greatestandleast, which sort all columns in a table lexicographically. These operators are like the<.operators which operate onExprs, but the<:operate on entire tables. (#139)
Other
- Support opaleye-0.8 (#142)
1.2.0.0 (2021-10-22)
New features
- New
$*and$+operators for projecting out ofListTableandNonEmptyTablerespectively (analogous to the existing$?forMaybeTable). (#125)
Bug fixes
-
Fix
UPSERTsupport (and add tests), which was broken due to a typo inside Rel8 that made it impossible to constructProjections which are needed byUPSERT. (#134) -
Remove
DBMinandDBMaxinstances forBool, which are invalid as far as Postgres is concerned.andandorcan be used to achieve the same thing. (#126) -
Fix
aggregateMaybeTable,aggregateEitherTableandaggregateTheseTable, which generated invalid SQL previously. (#127)
Breaking changes
rebindnow takes an additional argument for the “name” of the binding. (#128)
1.1.0.0 (2021-07-16)
New features
-
You can derive
Rel8ablefor “vanilla” higher-kinded data types - data types that don’t use theColumntype family. For example, the following is now possible:data MyTable f = MyTable { myTableX :: f Int32 , myTableY :: f Text } deriving (Generic, Rel8able) -
The
ProjectableandBiprojectabletype classes have been introduced. These classes model a type of functors and bifunctors (respectively) on tables, where the mapping function is only able to rearrange columns. For example, the following is now possible:x <- project myTableX <$> many ... -
Insert‘sonConflictfield now has a new option -DoUpdate. This maps to PostgreSQL’sON CONFLICT DO UPDATEsyntax, which provides upsert support. (#85) -
Insert,UpdateandDeletehas all been expanded to work withQuerys. In particular:Deletenow supports aUSINGsub-queryUpdatenow supports aFROMsub-queryInsertcan delete the result of any arbitraryQuery(providing the types match)
-
The new
Rel8.Tabulatemodule has been added, which gives aMap-esque interface to writing and composing queries. (#70) -
The new
indexedQuery -> Queryfunction was added. This function augments each row in a query with it’s 0-based index. (#117)
Breaking changes
-
Insert,DeleteandUpdatehave all changed. In particular, forInsertusers should now replacerows = xswithrows = values xs. (#85) -
Rename
whereExistsandwhereNotExiststopresentandabsentrespectively. (#57) -
Simplify
evaluateto run directly inside theQuerymonad, rendering theEvaluatemonad unnecessary. (#56) -
The
Labelabletype class has been removed as it’s no longer necessary. This class was mostly internal, though was visible in some public API functions. (#76) -
EitherTable,ListTable,MaybeTable,NonEmptyTableandTheseTablenow all have an extra parameter which tracks the context of the table. If you manually specified any types before, you need to provide this parameter - usuallyExprwill be the correct choice. (#101) -
We’ve done a lot of work to simplify the internals of Rel8, but some of these are breaking changes. However, most of these API changes shouldn’t affect users as they are mostly types used in type inference, or affect classes where users don’t need to define their own instances.
- The kind of a
Rel8ableis now(Type -> Type) -> Type. Previously it was(X -> Type) -> Type. Tablehas a new associated type -FromExprs. This was previously an open type family.Tablehas a new associated type -Transpose- andRecontextualisehas been renamed toTransposes. ThisTransposesclass now operates in terms ofTranspose.
- The kind of a
-
select,insert,updateanddeletenow produce HasqlStatements, rather than actually running the statement as IO. This allows Rel8 to be used with transaction/connection-managing monads likehasql-transaction. (#94)
Bug fixes
-
Fixes a bug where cartesian products of queries using
catListTable,catNonEmptyTable,catListandcatNonEmptywould incorrectly be zipped instead. (#61) -
Require Opaleye 0.7.3.0. This version has better support for lateral queries, which can improve query plans, especially in
optional/LEFT JOIN(#72) -
Rel8 now compiles with GHC 9. (#97)
Other changes
-
existsis now implemented in terms of the SQLEXISTSkeyword. (#69) -
alignByno longer requiresTables. (#67)
1.0.0.1 (2021-06-21)
This release contains various fixes for documentation.
1.0.0.0 (2021-06-18)
- Initial release.
