LoginSignup
3
1

More than 1 year has passed since last update.

TypeORM(with Docker)の環境構築からマイグレーション実行までの流れ

Posted at

TL;DR

この記事では、TypeORMのサンプル作成を題材に、Dockerコンテナへの環境構築からマイグレーション実行までの流れを紹介します。
なお、本記事は以下の参考サイトの内容をもとに、記事執筆時点での変更点(実行するコマンドなど)を加味したものになります。

記事執筆時の動作環境は、以下です。

TypeORMとは

TypeScript(およびJavaScript)で使用可能なORマッパーです。
GitHubのレポジトリはこちら

環境構築~コンテナの起動確認

開発用のフォルダを作成します。

$ mkdir typeorm-sample # 任意のフォルダ名でOK
$ cd typeorm-sample

TypeORMをインストールします。

$ yarn add typeorm

TypeScriptとts-node(NodeでTypeScriptを実行するためのライブラリ)をインストールします。
開発時に使用するものなので、インストール時に-Dオプションを付加します。

$ yarn add -D typescript ts-node

TypeORMのinitコマンドで、TypeORMの利用に必要なファイルを生成します。
使用するデータベースとして、今回はMySQLを指定します。ExpressのインストールとDockerに必要なファイル(docker-compose.yml)の生成も、オプションを指定すれば合わせて実行されます。

$ yarn typeorm init --database mysql --express --docker

docker-compose.ymlファイルの生成&内容確認の完了後、Dockerを立ち上げてMySQLコンテナの起動を確認します。(必要であれば、docker-compose.ymlに記載されたMySQLのバージョン変更などを行ってください)

$ docker compose up

docker-compse.ymlの内容をもとに、MySQLへの接続確認を行います。

$ docker compose exec mysql /bin/bash
$ mysql -utest -ptest
Mysql> show databases; # データベースの一覧が表示されればOK

MySQLへの接続確認が完了後、Expressサーバの起動を確認します。

$ yarn # 依存関係のインストール
$ yarn start # Expressサーバを起動

MySQLの8系を使用する場合、yarn startコマンドの実行時に「ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server;」のエラーが発生します。
このエラーは、MySQL8.0でパスワードの認証形式が変更されているものの、Node.jsの「mysql」ライブラリにはまだ実装がされていないことが原因で起こるようです。
本エラーは、以下のSQLをMySQLにてrootユーザで実行することで、エラー解消します。

ALTER USER 'username'@'%' IDENTIFIED WITH mysql_native_password BY 'password'

'username''password'は、適切な値に置き換えてください。(筆者の場合、どちらも'test'でした。)

Expressサーバの起動後、http://[ホスト名]:3000/usersにアクセスし、JSON文字列が表示されることを確認します。
このJSONでは、yarn typeorm initした際に作成されたuserテーブルのデータが表示されています。

ここまでで、環境構築&コンテナの起動確認は終了です。

マイグレーションの実行

最初に、Entity(テーブルの構造をクラス構文で表現したもの)を定義します。冒頭に記載の参考サイトと同様に、src/entity/Task.tsを作成します。(ファイルの記載内容は、参考サイトに譲ります)

Entityを定義(Task.tsを作成)後、以下のコマンドでマイグレーションファイルを作成します。

$ yarn run typeorm migration:generate -d ./src/data-source.ts ./src/migration/Task

注意点は、以下2点です。

注意点1
src/data-source.tsファイル(DataSourceの設定ファイル)に作成したEntityの追加が必要です。

src/data-source.ts
export const AppDataSource = new DataSource({
  // 不要な属性は省略しています
  // ...
  entities: [User, Task], // <- Taskを追加
  // ...
});

注意点2
TypeORMのコマンドの仕様が変わり、-nオプションは廃止となっているようです。上記コマンドのように、-dオプションでDataSourceの設定ファイルを指定し、コマンドの引数としてマイグレーションファイルの出力先を指定します。

マイグレーションファイルの作成を確認できたら、以下のコマンドで作成したマイグレーションを実行します。

$ yarn run typeorm migration:run -d ./src/data-source.ts

マイグレーションファイル作成時と同様に、src/data-source.tsファイルに設定追加が必要です。

src/data-source.ts
export const AppDataSource = new DataSource({
  // 不要な属性は省略しています
  // ...
  migrations: ["src/migration/**/*.ts"],
  // ↑ マイグレーションファイルのファイルパスを追加
  // ...
});

コマンドが正常に終了すれば、定義したEntityのテーブル(今回だとTaskテーブル)がMySQLに作成されています。

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