【发布时间】:2013-05-13 08:44:08
【问题描述】:
我正在尝试在我的 Yesod 应用程序中创建一个非 Web 服务,它需要与数据库进行一些交互。在this 的帖子中,我决定将服务放在makeApplication 中。我希望我的服务在某些事情发生时返回一些值并将其存储到数据库中。因此,我想知道最好的方法是什么?
如何在 makeApplication 函数中运行runDB $ insert $ Stuff (T.pack "stuff")?
编辑: 正如迈克尔建议的那样,我在 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 无效。
【问题讨论】:
标签: haskell persistent yesod persist