如何在 REPL 中运行 Yesod 的数据库操作?

Posted

技术标签:

【中文标题】如何在 REPL 中运行 Yesod 的数据库操作?【英文标题】:How can I run Yesod's DB actions in the REPL? 【发布时间】:2015-02-12 21:01:20 【问题描述】:

在正常的Handler 工作流中运行数据库操作很容易,因为runDB 函数可用于将SqlPersistM 操作转换为Handler 操作。

但是没有这种方法可以使用默认应用设置将SqlPersistM 直接转换为IO。查看应用程序脚手架中定义的Foundation.hs,有以下实例

instance YesodPersist App where
    type YesodPersistBackend App = SqlBackend
    runDB action = do
        master <- getYesod
        runSqlPool action $ appConnPool master
instance YesodPersistRunner App where
    getDBRunner = defaultGetDBRunner appConnPool

它基本上将runSqlPool 与应用程序的配置一起使用,但我看不到如何利用它来访问 REPL 中的配置表单的简单方法。

TL;DR:我正在寻找的只是能够在我的 Yesod 应用程序中的 cabal repl 中执行 runDB $ selectList [...] [...] 之类的操作,而无需复制 Yesod 脚手架所做的设置开箱即用。

【问题讨论】:

澄清一下,您使用的是yesod脚手架吗?如果是这样,您可以使用these functions 运行处理程序操作和数据库查询。用法示例:db $ selectList [UserName ==. "foo"] [] @MaxGabriel 我建议将该评论作为答案,它很好地展示了如何实现 Jakub 的目标。 好电话@MichaelSnoyman 【参考方案1】:

如果您使用 Yesod 脚手架,则提供 handler and db functions 让您分别从 repl 运行处理程序操作和数据库查询:

$ cabal repl

db $ selectList [UserName ==. "foo"] []

编辑:我还使用此信息更新了Yesod's wiki page on GHCi。它包含更多示例并涵盖了一些高级用法,例如使用调试器。

【讨论】:

谢谢!这正是我一直在寻找的。​​span>

以上是关于如何在 REPL 中运行 Yesod 的数据库操作?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Yesod 中捕获异常而不杀死站点?

Yesod:在 ghci 中运行“runDB”函数时键入实例错误

独立于主机名的 Yesod 应用程序

Yesod 持久示例

Yesod中的复合主键

如何判断我是在 Ammonite repl 下运行还是在脚本中运行?