LoginSignup
1
9

More than 5 years have passed since last update.

dockerでpostgresql環境を構築してテストをする話

Posted at

dockerでpostgresql構築

docker run -d --name dev-postgres -e POSTGRES_PASSWORD=test -p 5432:5432 postgres:alpine

-d:バックグラウンドで起動する
--name dev-postgres:dev-postgresという名前をつける
-e POSTGRES_PASSWORD=test:スーパーユーザーのパスワードを指定
-p:ホストの5432ポートでアクセスしたら、コンテナの5432に転送する
postgres:alpine:alpineを利用したpostgresのイメージ

起動確認

この記事中は、起動させたままにします。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
fc0dfbba334d        postgres:alpine     "docker-entrypoint..."   10 days ago         Up 12 seconds       0.0.0.0:5432->5432/tcp   dev-postgres

先ほどの設定が生きています。
IMAGEにはpostgres:alpine
PORTSでホストの5432からコンテナの5432に転送指定
NAMESにはdev-postgres

補足として、停止と削除は以下のコマンドから。

$ docker stop dev-postgres
$ docker rm dev-postgres

アクセス

dev-postgresにアクセス

docker exec -it dev-postgres bash

dev-postgres内でpostgres

psql -U postgres

postgresの色々

// 終了
¥q

// DB一覧表示
¥l

それらを実行した時のコード

$ docker exec -it dev-postgres bash
bash-4.3# psql -U postgres
psql (10.1)
Type "help" for help.

postgres=# \q
bash-4.3# exit
exit

テスト準備

npmでpgをインストールします。
typescriptを使いたいので、@types/pgもインストールします。

npm install pg @types/pg --save

テストコード

import * as pg from "pg";

describe( "Postgres", () => {
    before( async () => {
        const config = {
            user: "postgres",
            password: "test",
            port: 5432,
            host: "localhost",
            database: "postgres"
        };

        const client = new pg.Client( config );
        await client.connect();

        try {
            // testというdbが存在したら消す
            await client.query( "DROP DATABASE test" );
        } catch ( err ) {
            // 処理なし
        }

        // testというdbを作成
        await client.query( "CREATE DATABASE test;" );
    } );
    it( "1000件insert", async () => {
        const connectString = "tcp://postgres:test@localhost:5432/test";
        const client = new pg.Client( connectString );
        await client.connect();

        // テーブル作成
        await client.query( "CREATE TABLE users(id INTEGER, name CHAR(20) , PRIMARY KEY(id) )" );

        // 値挿入
        const text = "INSERT INTO users(id, name) VALUES($1, $2) RETURNING *";

        const len = 1000 | 0;
        let i = 0 | 0;
        console.time( "insert" );
        while ( i < len ) {
            await client.query( text, [ i, "name" + i ] );
            i = (i + 1) | 0;
        }
        console.timeEnd( "insert" );

        const res = await client.query( "SELECT COUNT (*) FROM users" );
        console.log( res.rows[ 0 ].count );
        await client.end();
    } );
} );
1
9
0

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
1
9