TypeORMで開発環境ごとにDB、設定を切り替える方法


1・はじめに

NodeJSでORMを使用する際にTypeORMを使用していますが、環境ごとにDBを切り替える方法についてあまり情報がなかったため、今回紹介しようと思います。

開発環境

OS・・・Ubuntu20.04LTS
TypeORM・・・0.2.32
Typescript・・・4.2.4
dotenv・・・8.2.0

2・TypeORMで環境ごとにDBを切り替える

まず始めに今回の方法を簡単に説明すると、

1・package.jsonと同じ階層にormconfig.jsファイルを用意する
              ↓
2・if文または三項演算子を使用してNODE_ENVごとに設定情報を分岐させる
              ↓
3・package.jsonのスクリプトに環境情報を追加する

です。それぞれ順を追って説明します。

2−1 package.jsonと同じ階層にormconfig.jsファイルを用意する

まずはプロジェクトのpackage.jsonと同じ階層にormconfig.jsファイルを用意します。
通常の方法ですとormconfig.jsonを使用する方法が一般的かと思いますが、

・dotenvの環境変数(process.env.~~)を設定ファイル内に記述できる
・if文や三項演算子のようなJavascriptの文法が記述可能である

以上のことからormconfig.jsonではなくormconfig.jsにTypeORMの設定を記述します。すでにormconfig.jsonがプロジェクトにある方はormconfig.jsに置き換えて下さい。

またormconfig.tsじゃあダメなの?と思う方がいらっしゃると思いますが、.ts形式にしてしまうと本番環境、言い換えればトランスパイル後のjsが設定ファイルを認識しなくなるため全環境に対応できるように.js形式にしています。

2−2 if文または三項演算子を使用してNODE_ENVごとに設定情報を分岐させる

次はNODE_ENVごとに設定情報を分岐させます。
例では三項演算子を使用して分岐させていますがif文でも問題なく動作しますのでお好みで好きな方を選んで下さい。

ormconfig.js
module.exports = {
    type: process.env.DATABASE_TYPE,
    username: process.env.DATABASE_USERNAME,
        //↓NODE_ENV==='production'で本番環境,'test'でテスト環境,設定しなければ開発環境になるよう設定
    host:
        process.env.NODE_ENV === 'production'
            ? process.env.DATABASE_HOST_PRODUCTION
            : process.env.NODE_ENV === 'test'
            ? process.env.DATABASE_HOST_TEST
            : process.env.DATABASE_HOST_DEVELOPMENT,
    port:
        process.env.NODE_ENV === 'production'
            ? process.env.DATABASE_PORT_PRODUCTION
            : process.env.NODE_ENV === 'test'
            ? process.env.DATABASE_PORT_TEST
            : process.env.DATABASE_PORT_DEVELOPMENT,
    password:
        process.env.NODE_ENV === 'production'
            ? process.env.DATABASE_PASSWORD_PRODUCTION
            : process.env.NODE_ENV === 'test'
            ? process.env.DATABASE_PASSWORD_TEST
            : process.env.DATABASE_PASSWORD_DEVELOPMENT,
    database:
        process.env.NODE_ENV === 'production'
            ? process.env.DATABASE_NAME_PRODUCTION
            : process.env.NODE_ENV === 'test'
            ? process.env.DATABASE_NAME_TEST
            : process.env.DATABASE_NAME_DEVELOPMENT,
        //↓開発時のみロギングをONにする
    logging: process.env.NODE_ENV === 'development' ? true : false,
        //↓テスト環境時のみsynchronizeをONにする
    synchronize: process.env.NODE_ENV === 'test' ? true : false,
        //↓テスト環境時のみ接続時DBをクリアにする
    dropSchema: process.env.NODE_ENV === 'test' ? true : false,
        //↓テスト環境時のみ「.ts」ファイルを参照する
    entities:
        process.env.NODE_ENV === 'test'
            ? ['src/entities/**/*.ts']
            : ['dist/entities/**/*.js'],
    migrations: ['dist/migration/**/*.js']

};

このような感じです。
私は開発時もトランスパイルしたjsファイルを参照しているので、entitiesもテスト環境以外は.jsファイルを参照しています。
このように各人若干開発環境や手法が違う場合があると思うので、各人自分の開発環境、手法に置き換えて実装してみて下さい。

2−3 package.jsonのスクリプトに環境情報を追加する

あとは切り替えたい環境によってpackage.jsonのスクリプトにNODE_ENV情報を追加すればOKです。

package.json
"scripts": {
        "dev": "nodemon dist/index.js",
        "test": "NODE_ENV=test jest"//テスト環境の設定に切り替えられる
    }

"dev"のスクリプトには何も記述していませんが、今回の例ではNODE_ENV情報を設定しなければ開発環境になるように設定したのでOKです。

3・まとめ

ormconfig.jsを使用してTypeORMの設定を記述すると、Javascriptの文法も使用できるため柔軟なDB環境の設定ができることがわかったと思います。
皆さんも開発時に試してみて下さい!