beam-migrate-0.3.1.0: SQL DDL support and migrations support library for Beam

Safe HaskellNone
LanguageHaskell2010

Database.Beam.Migrate.Backend

Contents

Description

Definitions of interest to those implement a new beam backend.

Steps to defining a beam backend:

  1. Ensure the command syntax for your backend satisfies Sql92SaneDdlCommandSyntax.
  2. Create a value of type BeamMigrationBackend
  3. For compatibility with beam-migrate-cli, export this value in an exposed module with the name migrationBackend.

This may sound trivial, but it's a bit more involved. In particular, in order to complete step 2, you will have to define several instances for some of your syntax pieces (for example, data types and constraints will need to be Hashable). You will also need to provide a reasonable function to fetch predicates from your database, and a function to convert all these predicates to corresponding predicates in the Haskell syntax. If you have custom data types or predicates, you will need to supply BeamDeserializers to deserialize them from JSON. Finally, if your backend has custom DatabasePredicates you will have to provide appropriate ActionProviders to discover potential actions for your backend. See the documentation for Database.Beam.Migrate.Actions for more information.

Tools may be interested in the SomeBeamMigrationBackend data type which provides a monomorphic type to wrap the polymorphic BeamMigrationBackend type. Currently, beam-migrate-cli uses this type to get the underlying BeamMigrationBackend via the hint package.

For an example migrate backend, see Database.Beam.Sqlite.Migrate

Synopsis

Documentation

data BeamMigrationBackend commandSyntax be hdl m where Source #

Backends should create a value of this type and export it in an exposed module under the name migrationBackend. See the module documentation for more details.

type DdlError = String Source #

Type of errors that can be thrown by backends during DDL statement execution. Currently just a synonym for String

Haskell predicate conversion

newtype HaskellPredicateConverter Source #

In order to support Haskell schema generation, backends need to provide a way to convert arbitrary DatabasePredicates generated by the backend's backendGetDbConstraints function into appropriate predicates in the Haskell syntax. Not all predicates have any meaning when translated to Haskell, so backends can choose to drop any predicate (simply return Nothing).

sql92HsPredicateConverters :: forall columnSchemaSyntax. Typeable columnSchemaSyntax => (Sql92ColumnSchemaColumnTypeSyntax columnSchemaSyntax -> Maybe HsDataType) -> HaskellPredicateConverter Source #

Converters for the TableExistsPredicate, TableHasPrimaryKey, and TableHasColumn (when supplied with a function to convert a backend data type to a haskell one).

hasColumnConverter :: forall columnSchemaSyntax. Typeable columnSchemaSyntax => (Sql92ColumnSchemaColumnTypeSyntax columnSchemaSyntax -> Maybe HsDataType) -> HaskellPredicateConverter Source #

Converter for TableHasColumn, when given a function to convert backend data type to a haskell one.

trivialHsConverter :: forall pred. Typeable pred => HaskellPredicateConverter Source #

Some predicates have no dependence on a backend. For example, TableExistsPredicate has no parameters that depend on the backend. It can be converted straightforwardly:

trivialHsConverter @TableExistsPredicate

hsPredicateConverter :: Typeable pred => (pred -> Maybe SomeDatabasePredicate) -> HaskellPredicateConverter Source #

Utility function for converting a monomorphically typed predicate to a haskell one.

For tooling authors

data SomeBeamMigrationBackend where Source #

Monomorphic wrapper for use with plugin loaders that cannot handle polymorphism

Constructors

SomeBeamMigrationBackend :: (Typeable commandSyntax, IsSql92DdlCommandSyntax commandSyntax, IsSql92Syntax commandSyntax, Sql92SanityCheck commandSyntax) => BeamMigrationBackend commandSyntax be hdl m -> SomeBeamMigrationBackend