这里的目标是将来自INSERT INTO ....的RETURNING数据流式传输到写入流。
即。
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,但如果我可以简单地获得返回的数据,那就太好了。
发布于 2021-05-26 19:41:35
发布正确的答案,因为问题作者选择不遵循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方法。
发布于 2021-05-26 16:52:07
不知道为什么我没有想到这一点,但解决方案是简单地使用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)
})https://stackoverflow.com/questions/67701173
复制相似问题