【问题标题】:How to perform database queries in GHCi in Yesod Application如何在 Yesod Application 中的 GHCi 中执行数据库查询
【发布时间】:2014-01-24 22:08:09
【问题描述】:

例如,如何使用 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'

接下来呢?

【问题讨论】:

  • 你尝试的第一件事是什么?
  • 看来我需要创建基础(默认为App)并以某种方式执行查询。
  • 我被困在创建 AppConfig 实例以创建 App 并在 Foundation 模块中定义 makeFoundation(默认为脚手架)。
  • 你为什么不更新你的问题/你坚持什么。更具体会有所帮助。
  • 您需要Yesod App还是只想知道如何在ghci中与Persistent交互?

标签: haskell yesod persistent ghci


【解决方案1】:

如果您只想在 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

【讨论】:

    【解决方案2】:

    脚手架在Application.hs 中提供了一个函数db(至少在yesod-bin 1.4.5 中),您可以使用它:

    $ cabal repl
    ...
    *Application> db $ insert $ User "foo@bar.com" Nothing
    

    【讨论】:

      【解决方案3】:

      看起来接受的答案已经很老了。这是使用 postgresql 后端在 IO 中运行持久查询的更新。

      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
      

      【讨论】:

        猜你喜欢
        • 2017-08-31
        • 1970-01-01
        • 2021-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-17
        • 2014-11-29
        相关资源
        最近更新 更多