1

首先,我有一个大型 Sqlite 数据库。我想使用 Haskell 持久库以流方式将此数据库中的数据子集复制到另一个 Sqlite 数据库。

这是我唯一设法做到的,但与将数据加载到内存中然后将其写入新数据库相比,它非常慢(并且使用更多内存)。

import Database.Persist.Sqlite (SqliteConf(..), runSqlite, runMigration, runSqlPersistMPool)
import Database.Persist (entityVal, Entity, createPoolConfig)
import Data.Pool (Pool)
import Data.Conduit (ConduitT, (.|), runConduit)
import qualified Data.Conduit.List as CL

main :: RIO App ()
main = do
  ipool <- liftIO $ createPoolConfig (SqliteConf "mydb.db" 1)
  opool <- liftIO $ createPoolConfig (SqliteConf "mydbsmall.db" 1)

  liftIO $ flip runSqlPersistMPool opool $ do
    runMigration migrateAll

  liftIO $ flip runSqlPersistMPool ipool $ do
    runConduit $ selectSource (distinct $ from $ \pays -> return pays) .| (migrate opool)

migrate :: (Monad m, MonadIO m)
        => Pool SqlBackend
        -> ConduitT (Entity Pays) Void m ()
migrate pool = CL.mapM_ (\e -> liftIO $ flip runSqlPersistMPool pool $ insertKey (entityKey e) (entityVal e))

问题出在migrate函数中,因为我正在调用runSqlPersistMPool管道流中的每一个数据。

什么是正确的方法?

4

0 回答 0