![](/img/trans.png)
[英]How can I make put and delete requests from a form using node.js and express.js?
[英]How can I put many script-generated records in PostgreSQL quickly from node.js?
以下代碼從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));
});
我采用了一些策略來加快速度。
TRUNCATE TABLE
而不是DELETE FROM
... ok 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();
當然,您將需要適當地逃避自己的價值觀
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.