如何使用withMySQLConn使用persistent-mysql进行查询?

时间:2015-02-02 03:36:30

标签: mysql database haskell yesod persistent

我正在使用persistent-mysql并试图找到一种从SqlPersistM () monad执行简单命令的方法。但是我遇到了类型错误。

首先是withMySQLConn defaultConnectInfo,其类型如下

(MonadLogger m, MonadBaseControl IO m, MonadIO m) =>
 (Connection -> m a) -> m a

问题在于,如果我尝试在IO monad中运行此操作,我会收到错误消息,指出MonadLogger没有IO个实例

λ> :t withMySQLConn defaultConnectInfo $
        \c -> runSqlPersistM (runMigration migrateAll) c

<interactive>:1:1-13:
    No instance for (MonadLogger IO)
      arising from a use of ‘withMySQLConn’
    In the expression: withMySQLConn defaultConnectInfo
    In the expression:
      withMySQLConn defaultConnectInfo
      $ \ c -> runSqlPersistM (runMigration migrateAll) c

似乎an older version of monad-logger中有一个,但是not anymore。我不确定我是否使用了这个错误,或者是否存在潜在问题。我只有一个小型的cabal项目,其中包含持久的2.1.1.4设置,并尝试从cabal repl运行迁移。

如果它有任何相关性,这是我的整个数据库设置代码

{-# LANGUAGE EmptyDataDecls             #-}
{-# LANGUAGE FlexibleContexts           #-}
{-# LANGUAGE GADTs                      #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses      #-}
{-# LANGUAGE OverloadedStrings          #-}
{-# LANGUAGE QuasiQuotes                #-}
{-# LANGUAGE TemplateHaskell            #-}
{-# LANGUAGE TypeFamilies               #-}
module Model where

import Control.Monad.Trans.Control
import Control.Monad.IO.Class
import Control.Monad.Trans.Resource (runResourceT, ResourceT)
import Control.Monad.Logger

import Data.Text (Text)
import Data.Time (UTCTime)
import Database.Persist
import Database.Persist.TH
import Database.Persist.MySQL
import Database.Persist.Sqlite

share [mkPersist sqlSettings, mkMigrate "migrateAll"]
    [persistLowerCase|
     Receipt
         name Text
         createdAt UTCTime
            |]

我尝试过使用persistent-sqlite,一切似乎都运行正常(基于书籍教程),但我似乎无法在MySQL中运行。

我正在寻找的是一个简单的代码段,展示了如何使用SqlPersistM a执行persistent-mysql查询(或等效查询)。

此问题是后续问题from a GitHub issue discussion

1 个答案:

答案 0 :(得分:4)

你几乎就在那里。您只需使用monad-logger中的一个函数来提供MonadLogger上下文。您可以尝试runStdoutLoggingT