[Haskell-cafe] Adding a DB Connection Pool to a Web Application

Steven Leiva leiva.steven at gmail.com
Thu Oct 26 12:43:39 UTC 2017


Hi Everyone,
I am trying to set up a simple web application, but with all the trappings of a
production app. (This is strictly for learning purposes).
At the moment, I am trying to get a database pool up and running that the rest
of the application can use. You can see my current progress at this repository.
You may want to look at only the code in the back-end folder, as there is a
whole front-end application.
So, again, my goal is to get a database pool up and running. At the moment, if I
try to build the executable target, I get the following error:

Error                   /Users/stevenleiva/Repos/todo/back-end/app/Main.hs:10:13: error:    • Couldn't match type ‘persistent-2.7.0:Database.Persist.Class.PersistStore.BaseBackend                             backend0’                     with ‘Database.Persist.Sql.Types.Internal.SqlBackend’        arising from a use of ‘createPostgresqlPool’      The type variable ‘backend0’ is ambiguous    • In a stmt of a 'do' block: pool <- createPostgresqlPool connStr 1      In the expression:        do { pool <- createPostgresqlPool connStr 1;             startApp }      In an equation for ‘main’:          main            = do { pool <- createPostgresqlPool connStr 1;                   startApp }
                

Not using Mixmax yet?  

I tried helping out the compiler by adding pool :: Pool Connection, after
importing those type constructors / constants. At that point, I got a different
error:

Error 2                   /Users/stevenleiva/Repos/todo/back-end/app/Main.hs:11:32: error:    • No instance for (monad-logger-0.3.25.1:Control.Monad.Logger.MonadLogger                         IO)        arising from a use of ‘createPostgresqlPool’    • In a stmt of a 'do' block:        pool :: Pool Connection <- createPostgresqlPool connStr 1      In the expression:        do { pool :: Pool Connection <- createPostgresqlPool connStr 1;             startApp }      In an equation for ‘main’:          main            = do { pool :: Pool Connection <- createPostgresqlPool connStr 1;                   startApp }
                

Not using Mixmax yet?  

I understand that createPostgresqlPool eventually gives me a value of type m
(Pool Connection), where there are some constraints on m. I also understand that
at the moment I am getting back a value IO (Pool Connection), and that IO does
not have an instance of MonadLogger.
>From here, I am at a bit of a lose on how to proceed. I thought implementing an
instance of MonadLogger for IO that would simply typecheck (and not log), but
that would lead to an orphaned instance, correct? What's the easiest next step
to make forward progress here?
P.S. I am aware that there are a lot of advanced (for me anyway) Haskell that
can be done via monad transformers, natural transformations, etc., in order to
wire up a DB with Servant, but I am happy with the "next simplest step" until I
learn some of those concepts better. (Then Haskell makes refactoring a breeze!).
Steven Leiva
305.528.6038
leiva.steven at gmail.com
http://www.linkedin.com/in/stevenleiva

Steven Leiva
305.528.6038
leiva.steven at gmail.com
http://www.linkedin.com/in/stevenleiva
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20171026/6c92091c/attachment.html>


More information about the Haskell-Cafe mailing list