pg-schema: Type-level definition of database schema and safe DML for PostgreSQL.
Schema definition
Use updateSchemaFile function from PgSchema.Generation module to generate type-level definition of database schema.
You can make several schemas with any parts of your database.
Usually you make executable which imports this module and run it to generate schema definition. You can run it on CI to check if schema definition is up to date.
Safe DML for PostgreSQL
Use PgSchema.DML module to describe and generate (in runtime) safe DML for PostgreSQL. All operations are statically checked and you can't write invalid SQL.
With pg-schema you can select or insert/upsert data into tree-like ADT in one request.
Example
Let's say
we have a database with tables: "orders", "order_positions", "articles".
There are articles with ids 41 and 42.
We have generated
MySchschema withupdateSchemaFilefunction from PgSchema.Generation module.
Then we can write a function to insert an order with order positions. And select orders with order positions and articles in one request using some conditions for orders and order positions that return in order.
data Order = Order { num :: Text, createdAt :: Day, items :: [OrdPos] } deriving Generic
data OrdPos = OrdPos { id :: Int32, num :: Int32, article :: Article, price :: Double } deriving Generic
data Article = Article { id :: Int32, name :: Text } deriving Generic
type MyAnn tabName = 'Ann 5 CamelToSnake MySch ("dbSchema" ->> tabName)
...
do
void $ insertJSON_ (MyAnn "orders") conn
[ "num" =: "num1" :. "ord__ord_pos" =:
[ "num" =: 1 :. "articleId" =: 42 :. "price" =: 10
, "num" =: 2 :. "articleId" =: 41 :. "price" =: 15 ] ]
(xs :: [Order]) <- selectSch (MyAnn "orders") conn $ qRoot do
qWhere $ "created_at" >? someDay
&&& pchild "ord__ord_pos" defTabParam
(pparent "ord_pos__article" $ "name" ~~? "%pencil%")
qOrderBy [descf "created_at", descf "num"]
qPath "ord__ord_pos" do
qWhere $ pparent "ord_pos__article" $ "name" ~~? "%pencil%"
qOrderBy [ascf "num"]
qLimit 20
Module structure
PgSchema.Generation - module with generation functions. Usually you make executable which generates schema definition using this module.
PgSchema.DML - module with DML functions. Import this module into your application and use it to generate safe DML for PostgreSQL.
PgSchema.Import - generated schema module imports this module.
[Skip to Readme]
Modules
[Index] [Quick Jump]
Flags
Manual Flags
| Name | Description | Default |
|---|---|---|
| arbitrary | Make Arbitrary instances for all types (Enums, PgTag, SchList) | Disabled |
| debug | Trace queries | Disabled |
| flat | Make Flat instances for all types (Enums, PgTag, SchList) | Disabled |
| hashable | Make Hashable instances for all types (Enums, PgTag, SchList) | Disabled |
Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info
Downloads
- pg-schema-0.5.0.0.tar.gz [browse] (Cabal source package)
- Package description (as included in the package)
Maintainer's Corner
For package maintainers and hackage trustees
Candidates
- No Candidates
| Versions [RSS] | 0.5.0.0 |
|---|---|
| Change log | ChangeLog.md |
| Dependencies | aeson (>=2.0 && <2.3), base (>=4.21.0 && <4.22), bytestring (>=0.12.2 && <0.13), case-insensitive (>=1.0 && <1.3), containers (>=0.7 && <0.9), directory (>=1.3.9 && <1.4), exceptions (>=0.9 && <0.11), mtl (>=2.0 && <2.4), pg-schema, postgresql-simple (>=0.6 && <0.8), scientific (>=0.2 && <0.4), singletons (>=3.0.3 && <3.1), singletons-th (>=3.4 && <3.6), text (>=2.0 && <2.2), time (>=1.12 && <2), uuid-types (>=1.0 && <1.1) [details] |
| License | BSD-3-Clause |
| Copyright | Dmitry Olshansky |
| Author | Dmitry Olshansky |
| Maintainer | olshanskydr@gmail.com |
| Uploaded | by odr at 2026-03-22T14:11:53Z |
| Category | Database |
| Home page | https://github.com/odr/pg-schema/tree/master/pg-schema#readme |
| Bug tracker | https://github.com/odr/pg-schema/issues |
| Source repo | head: git clone https://github.com/odr/pg-schema |
| Executables | test-gen |
| Downloads | 0 total (0 in the last 30 days) |
| Rating | (no votes yet) [estimated by Bayesian average] |
| Your Rating | |
| Status | Docs uploaded by user [build log] All reported builds failed as of 2026-03-22 [all 2 reports] |