PostgreSQLにテストデータを作成するnode.jsスクリプト
Couchbase編に続いて、PostgreSQLにテストデータを登録するスクリプトについて。
超メジャーなRDBなので、詳しい説明は省略。自分含めて初心者向けってことで、誰かの参考になるかもしれないので公開しておきます。
ポイントは、Clientオブジェクトのdrainイベントを拾ってるところで、クエリーキューが空になるまで待って、Clientオブジェクトをendしています。
一応、コールバックネストで処理はしているものの、さすがに1000件とかループすると、PostgreSQL側がクエリーを処理仕切れない内にスクリプトが終わろうとするので、スクリプト上にClient.end();を書くと、
Error: Connection terminated
って怒られます。
でも、Client.end()、もしくは、pg.end()を書かないと、スクリプトが終わってもイベントループのままでスクリプトが終わらない。
どうしたものかと思いつつ、クエリーキューかもと思って、
client.on('drain', client.end.bind(client));
と書いたら上手く行きました。参考:brianc/node-postgres Queryqueue
add-postgresql-data1.js
- 作成する件数は、
i < 1000
の部分を変更して下さい - age の値は乱数で生成します(適当に編集して下さい)
利用モジュール
- node-postgres brianc/node-postgres
- async
インストール
1.適当なディレクトリを作成
2.package.jsonファイルを作成
{
"devDependencies": {
"pg": "*",
"async": "*"
}
}
3.npm installで依存モジュールをインストール
4.同ディレクトリに、add-postgresql-data1.jsファイルを配置する
5.事前にテーブルを作成しておく(スクリプト参照)
実行
# node add-postgresql-data1
スクリプト
var pg = require('pg');
var async = require('async');
var connectString = "tcp://postgres@localhost:5432/test_db";
function randomInt (low, high) {
return Math.floor(Math.random() * (high - low + 1) + low);
}
/*
Data Format
---------------
CREATE TABLE t_dummy
(
id character varying(100),
age integer,
);
data
id : "user-"[1=>i]
age : random[10-90]
---------------
*/
pg.connect(connectString, function(err, client) {
if (err) {
console.log('Connection Error:', err);
throw err;
} else {
var counter = [];
for (var i = 0; i < 1000; i++) {
counter[i] = i;
}
async.eachSeries(counter, function(i, next) {
var qs = "INSERT INTO t_dummy (id, age) VALUES("
+ "'" + "user-" + (i+1) + "', "
+ randomInt(10, 90) + ");"
console.log("qs=" + qs);
client.query(qs, function(err, result) {
if(err) {
console.log('Insert Error! :' + (i+1));
throw err;
} else {
};
});
console.log('Inserted : ' + (i+1));
next();
}, function(err) {
console.log('Finished!');
client.on('drain', client.end.bind(client));
});
}
});
なお、スクリプトはGithubにも公開しています。
fujisan3/node.js-scripts