haskell - makeApplication函数内部如何查询数据库

标签 haskell persistent yesod persist

我试图在我的 Yesod 应用程序中 fork 一个非 Web 服务,它需要与数据库进行一些交互。来自 this我决定将服务放在 makeApplication 中。我希望我的服务在发生某些事情时返回一些值并将其存储到数据库中。因此,我想知道这样做的最佳方法是什么?

我如何运行 runDB $ insert $ Stuff (T.pack "stuff")在 makeApplication 函数中?

编辑:
按照迈克尔的建议,我在 Application.hs 中创建了以下辅助函数

runDBIO conf foundation f = do
    dbconf <- withYamlEnvironment "config/postgresql.yml" (appEnv conf)
        Database.Persist.loadConfig >>=
        Database.Persist.applyEnv
    p <- Database.Persist.createPoolConfig (dbconf :: Settings.PersistConf)
    logger <- mkLogger True stdout

    runLoggingT
        (Database.Persist.runPool dbconf f p)
        (messageLoggerSource foundation logger)

在 makeApplication 中,我像这样使用它:
runDBIO conf foundation $ do
    dbid <- insert $ Stuff (T.pack "some random stuff")
    string <- get dbid
    liftIO $ print string

但是,我收到此编译错误:
No instance for (resourcet-0.4.5:Control.Monad.Trans.Resource.MonadResource IO)
arising from a use of 'insert'

我是否为 runPool 输入了错误的类型?或者我需要为 insert 创建一个实例?
我不明白为什么runMigration migrateAll有效但 insert才不是。

最佳答案

您可以在 IO 中看到如何运行数据库操作的演示。 monad 在 the scaffolding itself .本质上,您需要提供两条信息:如何记录查询和数据库连接池。您可以将该代码分解为辅助函数(例如, runDBIO ),然后运行 ​​runDBIO $ insert $ Stuff $ T.pack "stuff" .

关于haskell - makeApplication函数内部如何查询数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16517968/

相关文章:

haskell - GADT 与存在量化类型 (*forall*)

compiler-construction - 为什么用函数式语言编写编译器更容易?

android - 来自服务的持久性 android 通知

C++ Qt编辑器问题

forms - 使用 yesod-form 在 POST/Redirect/GET 后保留不正确的用户输入

haskell - Integer 如何拥有 Enum 的实例? toEnum和fromEnum仅使用Int,这是有限的

haskell - `unsafeCoerce` Haskell 中的实现

entity - 带有 Eq 的 Yesod/Persistent 字段

html - Yesod CSS 卢修斯

mysql - 如何使用 withMySQLConn 使用 persistence-mysql 进行查询?