postgresql-simple
は、ストリーミングクエリの機能を提供します。postgresql-simpleを使用したストリーミングコンジットソースの作成
fold
:: (FromRow row, ToRow params)
=> Connection -> Query -> params -> a -> (a -> row -> IO a) -> IO a
ストリーミングを最大限活用するコンジットソースを作成したいと考えています。 IO
はfold
に(と思う?)反変な位置に表示されますので、
mySource :: (FromRow row, Monad m) => Source m row
残念ながら、私は本当に種類に苦しんでいます。次の型チェックでは、値を生成する前にストリーム全体を折りたたみます。
getConduit :: Connection -> IO (C.ConduitM() Event IO())
getConduit conn = fold_ conn queryEventRecord CL.sourceNull foo
where
foo :: C.ConduitM() Event IO() -> Event -> IO (C.ConduitM() Event IO())
foo cond evt = pure (cond >> C.yield evt)
これを実装する方法についてのあらゆる指針は非常に高く評価されます。ありがとう!最終的にするためにstm-conduit
を使用
、我々はこの動作を実装するために[postgresqlの-のlibpq](https://www.stackage.org/package/postgresql-libpq)にまで低下しました。私はpostgresql-simpleがこれを行うことができるとは思っていません(@ TMChanのアプローチ@Alecの言及に加えて)。 –
関数 '[query']を持つ' pipes-postgresql-simple'があります(https://hackage.haskell.org/package/pipes-postgresql-simple-0.1.2.0/docs/Pipes-PostgreSQL-Simple .html#v:query)これについては、 [produceIO'](https://github.com/ocharles/pipes-postgresql-simple/blob)の実装で見ることができるように、基本的に@Alecの戦略( 'pipes-concurrency'で実装されています)を使用しています。 /master/src/Pipes/PostgreSQL/Simple.hs#L117) – Michael