deezus blog

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

node.jsでMySQLに接続する

はじめに

typescript+node.jsでMySQLに接続するにはpromise-mysqlを使用します

インストール方法

npmでインストールします

npm install promise-mysql --save

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

npm install @types/mysql --save

使い方

データベースへの接続

import * as mysql from 'promise-mysql';
const connection = await mysql.createConnection({
            host: '[データベースのホスト]',
            user: '[ユーザーID]',
            password: '[パスワード]',
            database: '[データベース名]',
            multipleStatements: true
        });

multipleStatementsをtrueにすると一度に複数のクエリを実行することができます

クエリの実行

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

パラメータを指定する場合は下記のように、第二引数に配列を渡します

const data = await connection.query('SELECT * FROM `[テーブル名]` WHERE ID = ?', [ 1 ]);
for (const row of data.recordset) {
    console.log(row['カラム名']);
}

通常はquery関数ごとに1つのクエリしか実行できませんが、接続時にmultipleStatementsをtrueにしておけば複数のクエリを実行することができます
下記の例ではdeleteとupdateを同時に行います

await connection.query('DELETE `[テーブル名]` WHERE ID = ?; UPDATE `[テーブル名]` SET `[カラム名]` = ? WHERE ID = ?', [ 1, 'update_value', 2 ])

終了

await this.connection.end();

クラス例

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

import * as mysql from 'promise-mysql';
export class Mysql {
    private connection: mysql.Connection;

    /**
     * 接続
     * @param host
     * @param user
     * @param password
     * @param database
     * @returns {Promise}
     */
    public async connect(host: string, user: string, password: string, database: string) {
        this.connection = await mysql.createConnection({
            host: host,
            user: user,
            password: password,
            database: database,
            multipleStatements: true
        });
    }

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

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