| CARVIEW |
effectful-postgresql: effectful support for mid-level PostgreSQL operations.
Modules
[Index] [Quick Jump]
Flags
Automatic Flags
| Name | Description | Default |
|---|---|---|
| enable-pool | Enable support for connection pools using unliftio-pool. You can disable this for a lighter dependency footprint if you don't need support for connection pools. | Enabled |
Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info
Downloads
- effectful-postgresql-0.1.0.1.tar.gz [browse] (Cabal source package)
- Package description (as included in the package)
Maintainer's Corner
For package maintainers and hackage trustees
Candidates
| Versions [RSS] | 0.1.0.0, 0.1.0.1 |
|---|---|
| Change log | CHANGELOG.md |
| Dependencies | base (>=4 && <5), effectful-core (>=2.3 && <2.7), effectful-th (>=1.0.0.1 && <1.0.1), postgresql-simple (>=0.7 && <0.8), unliftio-pool (>=0.4.1 && <0.5) [details] |
| Tested with | ghc ==8.8.4, ghc ==8.10.7, ghc ==9.0.2, ghc ==9.2.4, ghc ==9.2.8, ghc ==9.4.2, ghc ==9.4.5, ghc ==9.6.1, ghc ==9.6.7, ghc ==9.8.2, ghc ==9.10.2 |
| License | BSD-3-Clause |
| Copyright | Copyright(c) Frederick Pringle 2025 |
| Author | Frederick Pringle |
| Maintainer | frederick.pringle@fpringle.com |
| Uploaded | by fpringle at 2025-08-04T11:06:42Z |
| Category | Database |
| Home page | https://github.com/fpringle/effectful-postgresql |
| Distributions | NixOS:0.1.0.1 |
| Reverse Dependencies | 1 direct, 0 indirect [details] |
| Downloads | 25 total (6 in the last 30 days) |
| Rating | (no votes yet) [estimated by Bayesian average] |
| Your Rating |
|
| Status | Docs uploaded by user Build status unknown [no reports yet] |
Readme for effectful-postgresql-0.1.0.1
[back to package description]effectful-postgresql
This package provides an effectful effect for postgresql-simple's Connection type.
It defines a dynamic effect to allow effectful functions to use a Connection, without worrying about where that Connection comes from.
For a higher-level effect library using Opaleye, see effectful-opaleye.
Effectful functions
In the WithConnection effect we can always request a Connection and use it as we normally
would:
import Effectful.PostgreSQL as EP
import qualified Database.PostgreSQL.Simple as PSQL
insertAndList :: (EP.WithConnection :> es, IOE :> es) => Eff es [User]
insertAndList = EP.withConnection $ \conn -> do
PSQL.execute conn "insert into users (first_name) values (?)" ["Nuala"]
PSQL.query conn "select * from users where first_name in ?" $ Only $ In ["Anna", "Boris", "Carla"]
In fact, for convenience we also define lifted versions of all of the query/execute
functions from postgresql-simple, so we can completely forget about Connection and rewrite the above to:
import Effectful.PostgreSQL
insertAndList :: (EP.WithConnection :> es, IOE :> es) => Eff es [User]
insertAndList = do
EP.execute "insert into users (first_name) values (?)" ["Nuala"]
EP.query "select * from users where first_name in ?" $ Only $ In ["Anna", "Boris", "Carla"]
The same goes for other functions:
-- use a transaction
insertAndListCarefully :: (EP.WithConnection :> es, IOE :> es) => Eff es [User]
insertAndListCarefully = EP.withTransaction insertAndList
-- stream + fold over results (in Eff)
countUsersIneffeciently :: (EP.WithConnection :> es, IOE :> es, Log :> es) => Eff es Int
countUsersIneffeciently =
EP.fold_ "select * from users" 0 $ \acc row ->
log $ "User: " <> show row
pure $ acc + 1
Interpreters
The simplest way of running the WithConnection effect is by just providing a Connection, which we can get in the normal ways:
import Effectful.PostgreSQL as EP
import qualified Database.PostgreSQL.Simple as PSQL
usingConnection :: IO ()
usingConnection =
bracket (PSQL.connectPostgreSQL "") PSQL.close $ \conn ->
runEff . EP.runWithconnection conn $ insertAndListCarefully
usingConnectInfo :: IO ()
usingConnectInfo =
runEff . EP.runWithconnectInfo PSQL.defaultConnectInfo $ insertAndListCarefully
Alternatively, we can use a connection pool (from resource-pool and unliftio-pool), which is much better suited to long-running processes like servers.
import Effectful.PostgreSQL as EP
import qualified Database.PostgreSQL.Simple as PSQL
import qualified UnliftIO.Pool as P
usingConnectionPool :: IO ()
usingConnectionPool = do
poolCfg <- P.mkDefaultPoolConfig (PSQL.connectPostgreSQL "") PSQL.close 5.0 10
pool <- P.newPool poolCfg
runEff . EP.runWithconnectionPool pool $ insertAndListCarefully