从 pg-promise 的插入流 "RETURNING"

Stream "RETURNING" from insert for pg-promise

此处的目标是将 RETURNING 数据从 INSERT INTO .... 流式传输到写入流。

                const write_stream = fs.createWriteStream('file.csv')
                client.query(`
                    INSERT INTO table1  (columns) 
                        SELECT ...
                        FROM table2
                        RETURNING *
                    `)
                    .then(returned => {
                        returned.rows.pipe(write_stream)                      
                    })

pg-promise可以吗?

目前 returned.rows 的响应包含数组 [{}] 中的所有数据,因此上面的示例不起作用,因此唯一的解决方案可能需要插入和 select 分开,但如果我能简单地获取返回的数据,那就太好了。

不知道为什么我没有想到这个,但解决方案只是使用 pg-query-stream


let qs = new QueryStream(`
       INSERT INTO table1 
          SELECT * FROM table2
       RETURNING *;`)

const write_stream = fs.createWriteStream('file.csv');
const { parse } = require('json2csv');
const stream = client.query(qs)
let fields = [];

stream
    .on('data', data => {
         // write csv headers
         if (!fields.length) {
             fields = Object.keys(data)
             write_stream.write(fields.join(',') + '\r\n')
         }

         try {
           // write csv data
           const csv = parse(data, {header : false})
           write_stream.write(csv + '\r\n')
         } catch (err) {
           stream.close()
         }
    })
    .on('end', (end) => {
      write_stream.end()
    })
    .on('error', (error) => {
       console.error(error)
    })

发布正确答案,因为问题作者选择不关注 the example provided

以下是将查询结果正确地流式传输到 csv 文件的方法(来自 pg-promise 的作者):

import QueryStream from 'pg-query-stream';
import CsvWriter from 'csv-write-stream';
import {createWriteStream} from 'fs';

const csv = new CsvWriter();
const file = createWriteStream('out.csv');

const qs = new QueryStream('select * from my_table');

await db.stream(qs, s => {
    s.pipe(csv).pipe(file);
});
//=> resolves with: {processed, duration}

参见stream方法。