gpt4 book ai didi

javascript - 如何从 Node.js 快速将许多脚本生成的记录放入 PostgreSQL 中?

转载 作者:行者123 更新时间:2023-12-03 11:34:37 25 4
gpt4 key购买 nike

以下代码从 Node.js 向 PostgreSQL 服务器插入 200,000 条记录,在我的笔记本电脑上花费了大约 17 分钟,感觉非常慢。

var pg = require('pg');
var Client = pg.Client;
var async = require('async');

var client = new Client(connectionString);
client.connect();

var rollback = function(client) {
client.query('ROLLBACK', function() {
client.end();
process.kill();
});
};

client.query('BEGIN',function(err,result){
if(err){ console.error(err); rollback(client);};
async.waterfall([
function(cb){
client.query('DROP INDEX idx',function(err,result){
client.query('TRUNCATE TABLE tbl',function(err,result){
async.forEach(values,function(value,valueNext){
client.query('INSERT INTO tbl ('
+ 'col1,'
+ 'col2) VALUES ($1,$2)',[
value,
generatedSomething(value)
],function(err){
valueNext();
});
},function(err,result){
if(err){ console.error(err); rollback(client);cb(false);return;};
client.query('CREATE INDEX idx ON tbl',function(err,result){
cb(null);
});
});
});
});
});
},
],function(err){
client.query('COMMIT', client.end.bind(client));
});

我应用了一些策略来加快速度。

  • 在插入之前删除所有索引,在所有插入完成后创建它 ... ok
  • 使用TRUNCATE TABLE而不是DELETE FROM...好的
  • 使用COPY FROM而不是INSERT INTO...未完成

似乎使用COPY FROM而不是INSERT INTO会生效,但它用于导入的CSV文件,而不是用于脚本生成的值。

那么,这是否意味着将脚本生成的值导出到临时 CSV 文件,并使用 COPY FROM 导入值是将值插入 PostgreSQL 的最有效方法快点吗?

最佳答案

copyFrom将返回 WritableStream您可以将您的值以 CSV 形式附加到其中,例如:

var stream = client.copyFrom("COPY tbl (col1, col2) FROM STDIN WITH CSV");
stream.on('close', function() {
client.query("COMMIT");
});
stream.on('error', rollback);
async.forEach(values, function(value, valueNext) {
stream.write(value + "," + generatedSomething(value) + "\n");
});
stream.end();

当然,您需要正确转义您的值(value)观

关于javascript - 如何从 Node.js 快速将许多脚本生成的记录放入 PostgreSQL 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26575065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com