2

この質問に対する明確な答えを探しましたが、まだ見つけることができませんでした - 永続的に実行されている SQL ステートメントの自動ロギングを有効にするにはどうすればよいですか? 誰かがこのための小さなサンプルプログラムを教えてもらえますか?

以下は、現在ログを記録していないプログラムの例です。ログインを有効にするにはどうすればよいですか?

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)
4

1 に答える 1

3

IO だけでなく、MonadLogger を実装する 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...

(resourcet と monad-logger への適切な依存関係を使用して)、SQL ステートメントを標準出力に書き込むことができます。

実際の例として、私の scion-class-browser プロジェクトを見てください。 runSqlite の呼び出しを参照してください。runLogging は、https://github.com/JPMoresmau/scion-class-browser/blob/f7f2ab0de4f4edb01b307411abf0aa951a3c7c48/src/Scion/PersistentBrowser/DbTypes.hs#L16 (現在ビルド バージョンはログに記録されません。コメント アウトされたコードに置き換えてください)。

もちろん、stdout や stderr への単純なダンプを使用する代わりに、必要な処理を行う独自の MonadLogger の実装を作成することもできます。

補足として、コードは一致するレコードを出力しません。これは、val Nothing と比較するのではなく、代わりに isNothing を使用する必要があるためです。

where_ (isNothing $ person ^. PersonStatus)
于 2015-05-13T15:38:41.943 に答える