4

我试图在我的 Yesod 应用程序中创建一个非 Web 服务,它需要与数据库进行一些交互。从这篇文章中,我决定将服务放在 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无效。

4

1 回答 1

2

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

于 2013-05-13T15:56:12.523 回答