An SQL-generating DSL targeting PostgreSQL
|Version on this page:||0.5.3.0@rev:2|
|LTS Haskell 20.24:||0.9.6.2|
|Stackage Nightly 2023-06-04:||0.9.6.2|
|Latest on Hackage:||0.9.6.2|
Module documentation for 0.5.3.0
Brief introduction to Opaleye
Opaleye is a Haskell library that provides an SQL-generating embedded domain specific language for targeting Postgres. You need Opaleye if you want to use Haskell to write typesafe and composable code to query a Postgres database.
“Opaleye really is great. You’ve managed to bring what is so wonderful about relational databases and give it type safety and composition (i.e. what is wonderful about Haskell)” – Daniel Patterson, Position Development
“We use it for most of our DB code. It’s very flexible and almost always as performant as manually written queries” – Adam Bergmark, Silk.co
Opaleye allows you to define your database tables and write queries against them in Haskell code, and aims to be typesafe in the sense that if your code compiles then the generated SQL query will not fail at runtime. A wide range of SQL functionality is supported including inner and outer joins, restriction, aggregation, distinct, sorting and limiting, unions and differences. Facilities to insert to, update and delete from tables are also provided. Code written using Opaleye is composable at a very fine level of granularity, promoting code reuse and high levels of abstraction.
- Github: https://github.com/tomjaguarpaw/haskell-opaleye
- Hackage: https://hackage.haskell.org/package/opaleye
Please get started with Opaleye by referring to these two tutorials
Contact the author
The main author of Opaleye is Tom Ellis. He can be contacted via email.
Please file bugs on the Opaleye GitHub issue tracking page.
Please join the opaleye-users mailing list.
Opaleye exports a number of modules named
They are provided in case of urgent need for access to the internals,
but they are not intended to be used by API consumers and if you find
yourself repeatedly accessing them this is a sign that either you or
Opaleye are doing something wrong. In such a case please file a bug.
The interface of
Internal modules does not follow the PVP and may
break between minor releases, so be careful.
Commercial support for Opaleye is provided by Purely Agile.
In the event of the main developer becoming unreachable, please contact the following who are authorised to make bugfixes and dependency version bumps:
- Adam Bergmark
- Erik Hesselink
- Oliver Charles
The Opaleye Project was founded by Tom Ellis, inspired by theoretical work on databases by David Spivak. Much of the implementation was based on ideas and code from the HaskellDB project by Daan Leijen, Conny Andersson, Martin Andersson, Mary Bergman, Victor Blomqvist, Bjorn Bringert, Anders Hockersten, Torbjorn Martin, Jeremy Shaw and Justin Bailey.
The following individuals and organisations have made helpful contributions:
- Silk (Erik Hesselink, Adam Bergmark)
- Karamaan (Christopher Lewis)
- Fynder (Renzo Carbonara, Oliver Charles)
- Daniel Patterson
- Jakub Ryška
- Travis Staton
Joseph Abrahamson, Alfredo Di Napoli and Mietek Bak performed useful reviews of early versions which helped improve the codebase.
- Added support for range types
- Corrected fixity for .&&
- Improved documentation
- Fixed handling of
BinExpr OpIn _ (ListExpr _)in
in_now actually uses the SQL
- Added support for
- support for JSON operators
- Many improvements to the Haddocks
- RIGHT and FULL OUTER joins
- intersection and except query binary operators
./==for comparison of product types
keepWhenas an alternative to
constantconversion to and from Aeson
Opaleye.Constantfor lifting constant values
- Support microseconds in
unsafeCompositeFieldto help with defining composite types
Orderis an instance of
Thanks to Adam Bergmark and Matt Wraith for helping with these changes.
- Ordering operators and
minaggregators are now restricted to a typeclass
PGOrdtypeclass for typesafe ordering operations.
- Support sorting NULLs first or last with
- Added JSON types
Thanks to Travis Staton, Jakub Ryška and Christopher Lewis for helping with these changes.
- Use time >= 1.4 and time-locale-compat
- Bump time to >= 1.5
- SQL code generator escapes column names, so table column names can be the same as SQL keywords.
- Add the types
Default QueryRunnerwith a new class
DefaultQueryRunnerColumn, migrate with
ShowConstant, use the monomorphic functions defined in the new module
Opaleye.PGTypesinstead. You will need to replace
Column PGBooletc. in query signatures
- Re-export more modules from
- Add operator fixities
- Add column instances for
- Expose fieldQueryRunnerColumn from Opaleye.RunQuery