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

Posted

技术标签:

【中文标题】如何使用 withMySQLConn 使用 persistent-mysql 进行查询?【英文标题】:How can I query using persistent-mysql using withMySQLConn? 【发布时间】:2015-02-02 03:36:30 【问题描述】:

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

首先是withMySQLConn defaultConnectInfo,有以下类型

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

这里的问题是,如果我尝试在 IO monad 中运行它,我会收到一条错误消息,指出 IO 没有 MonadLogger 实例。

λ> :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。我不确定我是否使用错了,或者是否存在潜在问题。我只有一个带有持久 2.1.1.4 设置的小型 cabal 项目,并尝试从 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 中运行。

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

这个问题是后续from a GitHub issue discussion。

【问题讨论】:

【参考方案1】:

你快到了。您只需要使用monad-logger 中的一个函数来提供MonadLogger 上下文。你可以试试runStdoutLoggingT

【讨论】:

谢谢!这正是我一直在寻找的。我会尽快接受答案。 @JakubArnold,如果问题的答案很好,最好不要过早接受。稍等一问,积累更多观点(帮助社区)和投票(帮助自己和回答者)。

以上是关于如何使用 withMySQLConn 使用 persistent-mysql 进行查询?的主要内容,如果未能解决你的问题,请参考以下文章

Vue:如何在 Vuex getter 中使用 Per-Route Guard?

如何从 Codeigniter 中的 URL 中删除“&per_page=”

如何从Codeigniter中的URL中删除“&per_page =”

Unity教程1:如何切割我的图片素材并使用tilemap搭建游戏背景(Pixels Per Unit设置不合适问题)

什么是符号张量,为什么它们会抛出“使用 `steps_per_epoch` 参数”错误?

如何将现有数据库的“innodb_file_per_table”参数从“OFF”更改为“1”?