3

在一个相关的Scala question中,我问了以下问题:

当我需要使用 JDBC 驱动程序从 PostgreSQL 数据库中读取数百万行数据库时,我总是使用游标,否则我会得到 OutOfMemoryError。这是我使用的模式(伪代码):

begin transaction
execute("declare cursor...")
while (true) {
  boolean processedSomeRows = false
  resultSet = executeQuery("fetch forward...")
  while (resultSet.next()) {
    processedSomeRows = true
    ...
  }
  if (!processedSomeRows) break
}
close cursor
commit

如何在惯用的 Haskell 中做到这一点?

4

1 回答 1

3

有一个非常新的概念来处理像 sql 游标这样的流:iterateesenumerator管道。例如,就管道库而言,来自Persistent Book

runResourceT $ withStmt "declare cursor..." []
    $$ mapM_ doSomethingWithSingleResult

withStmt "declare cursor..." []source用行创建,为处理单行mapM_ doSomethingWithSingleResult 创建,并用.sink$$sourcesink

于 2012-10-09T13:38:24.303 回答