Skip to content

Persistence interface for Haskell allowing multiple storage methods.

License

Notifications You must be signed in to change notification settings

yesodweb/persistent

Folders and files

NameName
Last commit message
Last commit date

Latest commit

5dbd756 · Jun 21, 2021
May 24, 2021
Apr 15, 2019
Feb 1, 2020
Jun 21, 2021
May 24, 2021
Jun 18, 2021
May 24, 2021
May 5, 2021
May 27, 2021
Mar 30, 2021
Jun 21, 2021
Jun 18, 2021
May 3, 2019
Oct 29, 2014
Apr 2, 2021
Apr 10, 2017
May 5, 2021
Dec 10, 2014
Apr 2, 2021
Sep 28, 2020
Apr 15, 2019
Apr 27, 2012
Apr 2, 2021
Jun 21, 2021
Apr 2, 2021
Dec 7, 2017
Dec 5, 2017
Nov 26, 2014
May 5, 2021
May 5, 2021
Mar 22, 2021
Jun 21, 2021
Jun 21, 2021
May 5, 2021

Repository files navigation

Join the chat at https://gitter.im/yesodweb/persistent Build Status Hackage Hackage-Deps

A Haskell datastore. Datastores are often referred to as "ORM"s. While 'O' traditionally means object, the concept can be generalized as:

avoidance of boilerplate serialization

In addition , the ORM concept is a way to make what is usually an un-typed driver type-safe. In dynamic languages rather than compile time errors, safety comes from creating specific dynamic errors rather than sending nonsense queries to the database.

Persistent's goal is to catch every possible error at compile-time, and it comes close to that.

Backend agnostic

Supports PostgreSql, Sqlite, MongoDB, Redis, ZooKeeper, and many other databases via persistent-odbc. The MySQL backend is in need of a maintainer. Currently there are issues with migrations and support for composite and primary keys is lacking.

Persistent is designed to be adaptable to any datastore, and to allow multiple datastores to be used simultaneously. The serialization layer should be adaptable to any datastore.

Providing a universal query layer will always be limiting. A major limitation for SQL databases is that the persistent library does not directly provide joins. However, you can use Esqueleto with Persistent's serialization to write type-safe SQL queries. Key-value stores such as Redis can be used with persistent, but only fill out the key-value portion of the API (PersistStore) rather than the query portion (PersistQuery).

Persistent provides several hooks to create backend-specific functionality. One can always fall back to using the raw database driver or other lower-level or less type-safe libraries and can utilize Persistent for un-serializing the database response to a Haskell record.

Install from source

Clone the repo and run stack build to build all targets. Persistent supports many backends. If you have only some of these installed the development doc shows how to build against a subset of targets.

Development

For more information on how to hack ont he persistent set of libraries, see the development.md file.