从 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方法。
此处的目标是将 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方法。