MySQL queryStream NodeJS

2024/02/28に公開

https://github.com/mysqljs/mysql#streaming-query-rows
の内容が古い

queryStreamの内容がそもそも記載が無いので、MariaDBを参考に自作
https://mariadb.com/docs/connect/programming-languages/nodejs/promise/query-stream/

queryStreamは1レコード単位で内容を取得する
長時間接続する羽目になるなら、connectionPoolなど考える必要がある

const mysql = require("promise-mysql");

async function MySQL_queryStream( _CONF ) {

 let connection = await mysql.createConnection( _CONF)
 console.info("connection.start")

 try {
    onst _SQL = `SELECT * From <TABLE>  Limit 10`
    await getRowData(connection, _SQL).then(()=>{
     Promise.resolve(null);
    });

 } catch (error) {
   console.error('ERR! MySQL_queryStream ->',error);
   Promise.reject()
   
 }finally{
   await connection.end()
   .then(() =>{
     console.info("connection.end")
   })
 }
}

async function getRowData(_CONNECTION, _SQL) {

 console.log("getRowData _SQL -> ", _SQL);
 let RowCount = 0;
 
 let _QUERY = _CONNECTION.queryStream(_SQL);
 _QUERY
 .on('error', function(_err) {
   console.log("Err getRowData: ", _err);
   throw _err;
 })
 .on('result', function(_row) {
   _CONNECTION.pause();

   RowCount++;

   //下記2行を出力すると速度は落ちる。動作確認できたら消す方が良い
   console.log("RowCount: ", RowCount);
   console.log("_row: ", _row);

   _CONNECTION.resume();
 })
 .on('end', function() {
   console.log("getRowData >>> end");
 });

}

Discussion