如何在Yesod应用程序中使用GHCi执行数据库查询

5
如何在Yesod应用程序的模型中插入一个新用户?或者有没有更好的方法?我正在处理搭建好的应用程序。现在我创建了"App"实例并不知道如何使用它执行请求。
:i Extra
data Extra
  = Extra {extraCopyright :: Data.Text.Internal.Text,
           extraAnalytics :: Maybe Data.Text.Internal.Text}
        -- Defined in `Settings

let e = Extra "asdf" Nothing
let c = AppConfig {appEnv = Development, appPort = 3000, appRoot = "/", appHost = "localhost", appExtra = e}
f <- makeFoundation c
:t f
f :: App

:i App
data App
  = App {settings :: AppConfig DefaultEnv Extra,
         getStatic :: Yesod.Static.Static,
         connPool :: persistent-1.2.3.0:Database.Persist.Class.PersistConfig.PersistConfigPool
                       PersistConf,
         httpManager :: http-client-0.2.0.1:Network.HTTP.Client.Types.Manager,
         persistConfig :: PersistConf,
         appLogger :: Yesod.Core.Types.Logger}
        -- Defined in `Foundation'

下一步是什么?

你尝试的第一件事是什么? - The Internet
看起来我需要创建基础(默认情况下是 App)并以某种方式执行查询。 - s9gf4ult
我在创建AppConfig实例时遇到了困难,以便使用Foundation模块中定义的makeFoundation创建App(这是默认的脚手架)。 - s9gf4ult
为什么不更新你的问题并说明你遇到了什么困难。更具体的描述会更有帮助。 - The Internet
你需要Yesod应用程序还是只想知道如何在ghci中与Persistent交互? - asm
3个回答

5
如果你只是想在ghci中进行持久化查询,而不创建Yesod应用程序,那么你可以这样做。不幸的是,具体使用哪个后端差异很大。
对于SQLite:
> import Database.Persist.Sqlite
> import Model
> pool <- createSqlitePool "yesod-test.sqlite3" 2
> runSqlite "yesod-test.sqlite3" (runMigration migrateAll)
> userId <- runSqlite "yesod-test.sqlite3" (insert (User "foo@bar.com" Nothing))

针对PostgreSQL:

-- In Shell: $ createdb yesod-test
> import Database.PostgreSQL.Simple
> con <- connectPostgreSQL  "dbname=yesod-test"
> import Database.Persist.Postgresql
> pcon <- openSimpleConn con
> import Model
> runSqlPersistM (runMigration migrateAll) pcon
> userId <- runSqlPersistM (insert (User "foo@bar.com" Nothing)) pcon
> Just user <- runSqlPersistM (get userId) pcon
> userIdent user

4
脚手架(至少在yesod-bin 1.4.5中)提供了一个名为db的函数,可以在Application.hs中使用:
$ cabal repl
...
*Application> db $ insert $ User "foo@bar.com" Nothing

0

看起来被接受的答案相当陈旧。这里提供一个更新版本,用于在IO中使用postgresql后端运行持久化查询。

import Control.Monad.Reader (ReaderT)
import Control.Monad.Logger (LoggingT, runStdoutLoggingT)
import Database.Persist.Sql (SqlBackend, runSqlConn)
import Database.Persist.Postgresql (withPostgresqlConn)

runDBIO :: ReaderT SqlBackend (LoggingT IO) a -> IO a
runDBIO = runStdoutLoggingT . withPostgresqlConn "dbname=test-db" . runSqlConn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接