Anu*_*ain 3 logging haskell persistent esqueleto
我已经搜索过这个问题的明确答案,但还没有找到一个答案 - How do I enableautomaticlogging of SQL statements being returned by persisted? 有人可以给我一个小示例程序吗?
以下是当前没有日志记录的示例程序。如何启用登录功能?
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
Person
name Text
status Text Maybe
deriving Show
|]
main :: IO ()
main = runSqlite ":memory:" $ do
runMigration migrateAll
insert (Person "Oliver Charles" Nothing)
insert (Person "Jon Snow" Nothing)
insert (Person "Marky Mark" (Just "helloo helloo"))
noStatusPeople >>= mapM_ (liftIO . print)
where
noStatusPeople =
select $ from $ \person -> do
where_ (person ^. PersonStatus ==. val Nothing)
return (person ^. PersonName)
Run Code Online (Sandbox Code Playgroud)
您需要在实现 MonadLogger 而不仅仅是 IO 的 Monad 中调用 SQL 代码。(请参阅http://hackage.haskell.org/package/monad-logger-0.3.13.1/docs/Control-Monad-Logger.html#v:runStdoutLoggingT)。但是,runSqlite 已经为您设置了日志记录(无…),因此您需要使用较低级别的函数 withSqliteConn。例如,如果您将代码更改为:
import Control.Monad.Logger
import Control.Monad.Trans.Resource
runResourceT $ runStdoutLoggingT $ withSqliteConn ":memory:" . runSqlConn $ do...
Run Code Online (Sandbox Code Playgroud)
(通过对资源和 monad-logger 的适当依赖),您可以将 SQL 语句写入标准输出。
作为一个现实生活中的例子,看看我的 scion-class-browser 项目:在https://github.com/JPMoresmau/scion-class-browser/blob/5ab9c7576f8faf93299826e72defe70dd5b6dd6f/src/Server/PersistentCommands.hs#L93中请参阅对 runSqlite 的调用。runLogging 是一个辅助函数,用于在记录或不记录日志之间切换,定义在https://github.com/JPMoresmau/scion-class-browser/blob/f7f2ab0de4f4edb01b307411abf0aa951a3c7c48/src/Scion/PercientBrowser/DbTypes.hs#L16(当前构建版本不记录,用注释掉的代码替换)。
当然,您可以编写自己的 MonadLogger 实现来执行您想要的操作,而不是使用简单的转储到 stdout 或 stderr。
附带说明一下,您的代码不会打印出匹配的记录,因为您不应与 val Nothing 进行比较,而应使用 isNothing:
where_ (isNothing $ person ^. PersonStatus)
Run Code Online (Sandbox Code Playgroud)