on dev help sign in
type safe foreign and primary keys

* check primary keys are all not null * check foreign keys reference all not null and either primary keys or unique columns

commit8945616c759328be8336c218d6aad6038ffdc934 authorEitan Chatav <eitan.chatav@gmail.com> dateSun 8 Apr 2018, 22:55 (9 years ago) parent8d2df16
2 files changed+15−3
squeal-postgresql/src/Squeal/PostgreSQL/Definition.hs+7−3 squeal-postgresql/src/Squeal/PostgreSQL/Schema.hs+8
squeal-postgresql/src/Squeal/PostgreSQL/Definition.hs+7−3
@@ -286,7 +286,8 @@ unique columns = UnsafeTableConstraintExpression $
286286-- "CREATE TABLE \"tab\" (\"id\" serial, \"name\" text NOT NULL, CONSTRAINT \"pk_id\" PRIMARY KEY (\"id\"));"
287287primaryKey
288288 :: ( Has alias schema table
289− , HasAll aliases (TableToColumns table) subcolumns )
289+ , HasAll aliases (TableToColumns table) subcolumns
290+ , AllNotNull subcolumns )
290291 => NP Alias aliases
291292 -> TableConstraintExpression schema alias ('PrimaryKey aliases)
292293primaryKey columns = UnsafeTableConstraintExpression $
@@ -337,8 +338,11 @@ foreignKey
337338 :: ( Has child schema table
338339 , Has parent schema reftable
339340 , HasAll columns (TableToColumns table) tys
340− , HasAll refcolumns (TableToColumns reftable) reftys
341− , SOP.AllZip SamePGType tys reftys )
341+ , reftable ~ (constraints :=> cols)
342+ , HasAll refcolumns cols reftys
343+ , SOP.AllZip SamePGType tys reftys
344+ , AllNotNull reftys
345+ , Uniquely refcolumns constraints )
342346 => NP Alias columns
343347 -- ^ column or columns in the table
344348 -> Alias parent
squeal-postgresql/src/Squeal/PostgreSQL/Schema.hs+8
@@ -56,6 +56,7 @@ module Squeal.PostgreSQL.Schema
5656 , TableConstraint (..)
5757 , TableConstraints
5858 , NilTableConstraints
59+ , Uniquely
5960 -- * Aliases
6061 , (:::)
6162 , Alias (Alias)
@@ -248,6 +249,13 @@ type TableConstraints = [(Symbol,TableConstraint)]
248249type family NilTableConstraints :: TableConstraints where
249250 NilTableConstraints = '[]
250251
252+type family Uniquely
253+ (keys :: [Symbol])
254+ (constraints :: TableConstraints) :: Constraint where
255+ Uniquely keys (uq ::: 'Unique keys ': constraints) = ()
256+ Uniquely keys (uq ::: 'PrimaryKey keys ': constraints) = ()
257+ Uniquely keys (_ ': constraints) = Uniquely keys constraints
258+
251259-- | `TableType` encodes a row of constraints on a table as well as the types
252260-- of its columns.
253261--