【NestJS】DataSourceを通してDBアクセス&マイグレーション

NestJS Nestjs

概要

  • TypeOrmModule.forRoot({})をDataSourceで定義、config利用、そしてtypeorm cliでも利用できるようにしたい。
  • プロセスの起動のためのDB環境変数の用意と使用は色々の資料で参考できますがプロセスの起動にもマイグレーションにも使用できる環境変数の扱いに苦労したので整理を重ねておきたいと思います。

DataSourceを用意

環境変数を読み込み

.envファイルから環境変数、ここではDBに関する(mysql)環境変数のみ扱います。

$ cat .env
PORT=3000
ENVIRONMENT=development

DATABASE_HOST=localhost
DATABASE_PORT=3306
DATABASE_NAME=データベース名
DATABASE_USERNAME=データベースユーザー
DATABASE_PASSWORD=データーベースユーザーパスワード
DATABASE_LOGGING=true
DATABASE_ACQUIRE_TIMEOUT=60000
DATABASE_SSL=false
SYNCHRONIZE=false

読み込んだ変数からDataSourceを作成

dotenvモジュールを利用します。

$ cat src/config/configure.ts
...
export default {
  ...
  // Database Config
  database_host: process.env.DATABASE_HOST || 'localhost',
  database_port: parseInt(process.env.DATABASE_PORT, 10) || 3306,
  database_name: process.env.DATABASE_NAME,
  database_username: process.env.DATABASE_USERNAME,
  database_password: process.env.DATABASE_PASSWORD,
  ...
};

読み込んだ環境変数からDataSourceを作成します。

$ cat src/config/data-source.ts
import { DataSource, DataSourceOptions } from 'typeorm';
import config from '../config/configure';

export const dataSourceOptions: DataSourceOptions = {
  type: 'mysql',
  host: config.database_host,
  port: config.database_port,
  username: config.database_username,
  password: config.database_password,
  database: config.database_name,
  entities: [`${__dirname}/../models/entities/*.{ts,js}`],
  migrations: [`${__dirname}/../models/migrations/*.{ts,js}`],
  migrationsTableName: 'migrations',
  extra: {
    ssl: config.database_ssl,
  },
  synchronize: false,
  logging: config.database_logging,
};

const dataSource = new DataSource(dataSourceOptions);

export default dataSource;

AppModuleから利用する

$cat src/app.module.ts
...
import { dataSourceOptions } from '@/config/data-source';
...
@Module({
  imports: [
    ConfigModule.forRoot(),
    TypeOrmModule.forRoot(dataSourceOptions),
    ...
  ],
  controllers: [...],
  providers: [...],
})
export class AppModule {}

起動してDBアクセスを確認

$ npm run start:dev
...
[Nest] 26088  - ***     LOG [NestFactory] Starting Nest application...
...
[Nest] 26088  - ***     LOG [InstanceLoader] ConfigModule dependencies initialized +0ms
query: SELECT VERSION() AS `version`
...
[Nest] 26088  - ***     LOG [NestApplication] Nest application successfully started +2ms

データベースに接続できまして利用可能になりました。

マイグレーション

いつ使う

本番稼働環境に入ったら、モデルの変更をデータベースに同期させる必要があります。 通常、synchronize: true を使用することは安全ではありません。データベースにデータを取得すると、本番環境でのスキーマ同期に使用できます。 そこで、マイグレーションが助けになります。

マイグレーションは、データベーススキーマを更新し、既存のデータベースに新しい変更を適用するための、sqlクエリを実行のためです。

使用環境について

上記のdataSourceを使用するscriptをpackage.jsonに登録する。

※注意点

data-source.tsからimportをtsconfig.jsonの「path」に依存せずpathを指定すること。

$ cat src/config/data-source.ts
import config from '../config/configure';

基本script

ベース
  "script": {
    "typeorm-dev": "ts-node ./node_modules/typeorm/cli",
  }
$ npm run typeormcli

> testdb@0.0.1 typeormcli
> ts-node ./node_modules/typeorm/cli

Usage: bin.js <command> [options]
...
$

との結果なら.envが読み込まれdataSourceが使用できプロセスの起動もできる、マイグレーションもできる状態です。

スクリプト追加
  "script": {
    "typeorm-dev": "ts-node ./node_modules/typeorm/cli",
    "migration:create": "npm run typeormcli migration:create",
    "migration:generate": "npm run typeormcli -- -d src/config/data-source.ts migration:generate",
    "migration:run": "npm run typeormcli -- -d src/config/data-source.ts migration:run",
    "migration:revert": "npm run typeormcli -- -d src/config/data-source.ts migration:revert"
  }

create

$ npm run migration:create -- src/models/migrations/add-table-users
...
...
$ ls src/models/migrations/*add-table-users*
src/models/migrations/162840331208-add-table-users.ts

生成されたファイルを編集する

  • up : データーベースに変更を与えるSQLを書く、Create, Alter, Insert等
  • down: upの取消を書く。(revertで実施される)

run

dataSourceの「 migrations: [`${__dirname}/../models/migrations/*.{ts,js}`],」にあるファイルらの中で実施されなかったmigrationを実施する、実施内容は「migrationsTableName: ‘migrations’,」テーブルに保存しておく。

$ npm run migration:run

revert

最後に実施されたマイグレーションのdownを実施します。

$ npm run migration:revert

generate

entityとdatabaseを比較してマイグレーションを生成します。

$ npm run migration:generate -- src/models/migrations/diff
...
...
$ ls src/models/migrations/*diff*
src/models/migrations/162840331208-diff.ts
終わりに

お疲れ様!

タイトルとURLをコピーしました