【发布时间】:2016-01-20 14:43:13
【问题描述】:
我需要用 1.5 G 左右的 tsv 文件填充 PG。我计划使用流式传输和 pg-copy-stream,它适用于直接复制。然后我需要做一些转换并添加一个直通管道,但它失败了。我想这可能是一个缓冲区问题,一定有人这样做了。
来源tsvfile.txt有格式
V1\tV2\tV3\tV4\n
V2\tV2\tV3\tV4\n
代码是
var fs = require('fs'), pg = require('pg'), es = require('es'), pgs = require('pg-copy-stream');
var filename = 'tsvfile.txt';
var pgkey = 'somepgkey';
pg.connect(pgkey, function(err, client, done){
var query = client.query(pgs.from('COPY table1 (C1, C2, C3, C4) FROM STDIN'));
var fstream = fs.createReadStream(filename);
fstream.pipe(es.split())
.pipe(es.mapSync(function(line){
var midline = line.split('\t').map(sometransform()).join('\t');
return midline + '\n';
//not sure \n is necessary here
}).pipe(query)
.on('end', done)
.on('err', somethingelse)
})
我得到的错误是
error: extra data after last expected column,但如果我移除前两个管道,效果很好。
【问题讨论】:
-
更新:如果我删除前 2 个管道,它工作正常。但是当我通过`query.on('data', callback)注册一个侦听器来查询(这是一个流)时,它又把整个过程搞砸了。 pg 将放弃通信并且不存储任何数据。它可能与 pg-copy-stream 模块有关。
标签: javascript postgresql event-stream