LoginSignup
10
11

More than 5 years have passed since last update.

PostgreSQLにテストデータを作成するnode.jsスクリプト

Posted at

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 の値は乱数で生成します(適当に編集して下さい)

利用モジュール

インストール

1.適当なディレクトリを作成
2.package.jsonファイルを作成

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

10
11
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
11