Skip to content

Kamirus/purescript-selda

Repository files navigation

purescript-selda

CI

About

purescript-selda is an SQL library (eDSL) which allows a user to write type-safe queries.

  • Generated SQL is guaranteed to be correct by the type system.
  • It supports arbitrarily nested queries with capabilities of filtering, joins and aggregation.
  • We used standard monadic abstraction which supports writing queries in a linear, natural style.
  • Our main target is PostgreSQL though in the upcoming release (already on master) we add SQLite3 support (with ability to support other db backends).

Example Query

To declare a type for a SQL table (already created in the db) we write the following table definition:

people  Table (id  Int, name  String, age  Maybe Int)
people = Table { name: "people" }

Once we've defined the tables, we can write queries, e.g.

selectFrom people \{ id, name, age } → do
  { balance } ← leftJoin bankAccounts \b → id .== b.personId
  restrict $ id .> lit 1
  pure { id, balance }

Generated SQL for the above query:

SELECT people_0.id AS id, bank_accounts_1.balance AS balance
FROM people people_0
LEFT JOIN bank_accounts bank_accounts_1 ON ((people_0.id = bank_accounts_1.personId))
WHERE ((people_0.id > 1))

For a more gentle introduction and more examples please refer to the Step-by-Step Guide.

More Help

If you have any questions please don't hesitate to ask.
I'll be happy to help and provide any guidance if necessary.
Open an issue or hit me up directly (either on slack, forum or directly via email).

Install

Install postgresql-client's dependencies

npm install pg decimal.js

Info

  • Introductory Guide: End-to-End example: how to setup, write queries, use aggregation, deal with type errors and execute queries and inserts.
  • Advanced Guide: Custom Types and Expressions (litPG, Any, EForeign, custom PG functions), more flexible table definitions (Source, db schemas, set-returning functions) - unsafe escape hatches
  • Test Suite: For information about features, examples, usage, etc. refer to the test suite: Test.Common, Test.PG, Test.SQLite3. To run the tests, docker-compose up -d helps to prepare postgres database.
  • Documentation: Pursuit docs
  • My thesis

Credits

Supported by Lambda Terms

Inspired by selda