首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从pg-promise的insert“返回”流

从pg-promise的insert“返回”流
EN

Stack Overflow用户
提问于 2021-05-26 16:23:37
回答 2查看 67关注 0票数 0

这里的目标是将来自INSERT INTO ....RETURNING数据流式传输到写入流。

即。

代码语言:javascript
复制
                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的响应包含数组{}中的所有数据,因此上面的示例不起作用,因此唯一的解决方案可能需要分别执行insert和select,但如果我可以简单地获得返回的数据,那就太好了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-26 19:41:35

发布正确的答案,因为问题作者选择不遵循the example provided

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

代码语言:javascript
复制
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方法。

票数 1
EN

Stack Overflow用户

发布于 2021-05-26 16:52:07

不知道为什么我没有想到这一点,但解决方案是简单地使用pg-query-stream

代码语言:javascript
复制
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)
    })
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67701173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档