在ghci中加载一个脚手架网站后,获取runDB的正确实例是什么?例如,在运行这句话时:
runDB $ selectList [UserName ==. "Renny"] []
错误是:
Couldn't match type `PersistMonadBackend
(YesodPersistBackend site0 (HandlerT site0 IO))'
with `persistent-1.3.0.6:Database.Persist.Sql.Types.SqlBackend'
The type variable `site0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Expected type: PersistMonadBackend
(YesodPersistBackend site0 (HandlerT site0 IO))
Actual type: PersistEntityBackend User
In the second argument of `($)', namely
`selectList [UserName ==. "Renny"] []'
In the expression: runDB $ selectList [UserName ==. "Renny"] []
In an equation for `it':
it = runDB $ selectList [UserName ==. "Renny"] []
提前致谢
编辑:
我忘了Yesod Scaffold runDB
返回一个Handler,这让我得到了这个解决方法(虽然我确信这是一个更好的解决方案):
xs <- runSqlite "MyProject.sqlite3" (selectList [UserName ==. "Renny"] [])
其中"MyProject.sqlite3"
是Sqlite数据库的名称。
这不是一般化的解决方案。根据文档,正如 post 所述,其他后端略有不同。
答案 0 :(得分:3)
问题在于,与依赖于环境状态的命令式语言不同,Haskell依赖于显式(和隐式)状态传递。
从ghci运行runDB $ ...
时,您试图直接在IO中运行此代码段,因此您没有引用您的应用程序状态(包括您的数据库连接)。类型错误通知您The type variable 'site0' is ambiguous
,因为它无法推断您尝试运行此语句的应用程序状态。
在ghci中,前缀runSqlite "MyProject.sqlite3"
有效,因为你专门设置了对正确数据库运行的环境,而runSqlite在IO中工作,这就是ghci想要的。