我正在尝试在我的Yesod应用程序中分叉非Web服务,它需要与数据库进行一些交互.从
this发布后,我决定将服务放在makeApplication中.我希望我的服务在某些事情发生时返回一些值并将其存储到数据库中.因此,我想知道最好的方法是什么?
如何在makeApplication函数中运行runDB $insert $Stuff(T.pack“stuff”)?
编辑:
正如Michael所建议的,我在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输入了错误的类型?或者我需要为插入创建一个实例?
我不明白为什么runMigration migrateAll工作但插入不行.
最佳答案 您可以在
the scaffolding itself中看到如何在IO monad中运行数据库操作的演示.实际上,您需要提供两条信息:如何记录查询以及数据库连接池.您可以将该代码分解为辅助函数(例如,runDBIO),然后运行runDBIO $insert $Stuff $T.pack“stuff”.