如何在不将所有行加载到内存中的情况下使用 node-mysql?

Ami*_*ein 4 node.js node-mysql

我正在使用 NodeJS。我想对 1,000,000 行做一些事情而不将所有行加载到内存中。(for-each)

以前,当我使用 ASP Classic 时,我做了:

do while not rec.eof
   //do something
   rec.movenext
loop
Run Code Online (Sandbox Code Playgroud)

在 node-mysql 中,我没有发现任何类似于游标的东西。只要

connection.query('select * from bigdata',function(err,rows))
Run Code Online (Sandbox Code Playgroud)

问题是,我不想一次加载所有行。

我找到了答案,放在下面。我保留这个问题是为了帮助其他有同样问题的人

Ami*_*ein 7

感谢Ziggy Jonshon,我在 node-mysql 中找到了类似于 cursor 的东西,使用流。

我可以通过流获取查询结果,并自动暂停:

请参阅 node-mysql 上的问题 #1370

const mysql = require('mysql');
const stream = require('stream');

connection.query('SELECT * FROM `bigdata`')
  .on('error', function(err) {
    // Do something about error in the query
  })
  .stream()
  .pipe(new stream.Transform({
    objectMode: true,
    transform: function (row, encoding, callback) {
      // Do something with the row of data

      callback();
    }
  }))
  .on('finish', function() {
    connection.end();
  });
Run Code Online (Sandbox Code Playgroud)

这样我就不需要将所有数据加载到节点进程的内存中。