deezus blog

.Net Core、Typescriptを中心に技術的ノウハウを公開しています

node.jsでpostgresqlに接続する

はじめに

typescript+node.jsでpostgresqlに接続するにはpgを使用します

インストール方法

npmでインストールします

npm install pg  --save

typescriptを使用するので型定義もインストールします

npm install @types/pg --save-dev

使い方

データベースへの接続

import { Client } from 'pg';
const client = new Client({
                host: '[データベースのホスト]',
                database: '[データベース名]',
                user: '[ユーザーID]',
                password: '[パスワード]'
            });
client.connect();

connect()はPromiseを返しますので、awaitを使って下記のようにできます

await client.connect();

一連の処理を一つの関数にすると下記のようになります

const pgConnect = async () => {
    const client = new Client({
                host: '[データベースのホスト]',
                database: '[データベース名]',
                user: '[ユーザーID]',
                password: '[パスワード]'
            });
    await client.connect();
    return client;
}

クエリの実行

const result = await client.query('SELECT * FROM "[テーブル名]"');
for (const row of result.rows) {
    console.log(row['カラム名']);
}

query()でクエリを実行します
この関数もPromiseを返します
クエリの実行結果のrowsにデータが格納されており、カラム名で値を取得することができます
パラメータを使用するには、第二引数に配列で指定します

const result = await client.query('SELECT * FROM "[テーブル名]" WHERE ID = $1', [1]);

終了

await client.end();

クラス例

以上の関数を実装したクラス例です

import {Client} from 'pg';
export class Postgres{
    private client: Client;

    /**
     * 接続
     * @param {string} host
     * @param {string} user
     * @param {string} password
     * @param {string} database
     * @returns {Promise}
     */
    public async connect(host: string, user: string, password: string, database: string){
        this.client = new Client({
            host: host,
            user: user,
            password: password,
            database: database
        });
        await this.client.connect();
    }

    /**
     * クエリ実行
     * @param {string} query
     * @param {any[]} parameters
     * @returns {Promise}
     */
    public async query(query: string, parameters: any[] = []){
        return (await this.client.query(query, parameters)).rows;
    }

    /**
     * 終了
     * @returns {Promise}
     */
    public async end(){
        await this.client.end();
    }
}