【发布时间】:2014-04-03 13:49:18
【问题描述】:
有没有一种好方法可以将流形式的大型 CSV (4GB+) 放入 NodeJS 中的 postgres 数据库中?
特别是,我想取第一行(标题行)并从中制作一个创建查询。然后,我想将文件的其余部分流式传输到 from 语句的副本。
如果我只想发送到复制命令,这将是可行的,例如:
function copyStreamIntoTable (inputStream) {
var deferred = Q.defer();
pg.connect("pg://postgres@localhost/npi_demo", function (err, client) {
var s = client.copyFrom("COPY hptc (code, type, classification, specialization, definition, notes) FROM STDIN WITH CSV HEADER");
inputStream.pipe(through(function (data) {
this.queue(data.toString("ascii"));
})).pipe(s).on('close', function () {
deferred.resolve();
});
});
return deferred.promise;
}
但我希望流读取第一行,然后运行创建查询。创建查询完成后,id 喜欢将流的其余部分流式传输到 copyFrom。
有没有一种优雅的方法来做到这一点?对于 nodejs 和流,我仍然是一个相对较新的人。
【问题讨论】:
-
检查 node.js 的 PostgreSQL 接口是否在其 API 中明确支持
COPY。如果可能,您将希望使用任何此类支持,而不是尝试直接使用COPY语句。 -
@CraigRinger 谢谢——我会检查一下。
-
作为旁注,我对节点中的流感到非常困惑......我知道我可以使用 readline 之类的东西来阅读第一行......我可能会把剩下的写到使用 readline 的 postgres 流......但是为了正确尊重 pg 施加的背压,除非我使用管道,否则事情似乎很快变得更加复杂
-
@MichaelWasser 嘿,我是 node 新手,我有同样的问题,你能把代码发给我吗?或者更多解释一下这个
标签: node.js postgresql csv