【NestJS/TypeORM/MySQL】TypeORM CLIでテーブルを作ってみよう

【NestJS/TypeORM/MySQL】TypeORM CLIでテーブルを作ってみよう

はじめに

コジマです。

【NestJS/TypeORM/MySQL】DBに接続してデータを取得する
このときにはテーブルを手動で作ったけど、今回はCLIで作ってみよう。ってやつです。

やること

  1. ormconfig.jsonをつくる
  2. ts-nodeをインストール
  3. package.jsonを修正
  4. entityファイルをつくる(entity:craete)
  5. migrationファイルをつくる(migration:generate)
  6. テーブルをつくる(migration:run)

ormconfig.jsonをつくる

プロジェクトフォルダの直下に作成します。
接続情報は自身の環境に合わせてください。
ormconfig.json

{
  "type": "mysql",
  "host": "localhost",
  "port": 3306,
  "username": "root", // お好みで
  "password": "my-secret-pw", // お好みで
  "database": "mydb", // お好みで
  "entities": ["src/entities/*.entity{.ts,.js}"],  // お好みで。この記事ではここを参照します。
  "migrations": ["src/migrations/*{.ts,.js}"], // お好みで。この記事ではここを参照します。
  "synchronize": false  // 勝手にテーブル作らないようにfalseとする
}

ts-nodeをインストール

ts-nodeをインストールします。やたらめったらグローバルにインストールするのは好きじゃないので
プロジェクトだけに反映させますが、グローバルにインストールしたい人はそれでも良いです
ts-nodeコマンドを入れておくと、TypeScriptを直接実行することができるようになります。

npm install --save ts-node

// グローバルにインストールした人はこっち
npm install -g ts-node

まだTypeORMをインストールしてないよ~って人はインストールしてね。

npm install --save typeorm

package.jsonを修正

npx経由でts-nodeを実行したいですが、引数だらけでめんどくさいのでpackage.jsonを修正してエイリアスつけちゃいます。

私は以下のように追加しました。もっといいつけ方あれば教えて~。

  "scripts": {
    (略)
    "typeorm:entity:create": "npx ts-node ./node_modules/typeorm/cli entity:create -d src/entities -n",
    "typeorm:migration:generate": "npx ts-node ./node_modules/typeorm/cli migration:generate -d src/migrations -n",
    "typeorm:migration:run": "npx ts-node ./node_modules/typeorm/cli migration:run",
    "typeorm:schema:sync": "npx ts-node ./node_modules/typeorm/cli schema:sync"
  },

entityファイルをつくる(entity:craete)

entityファイルを作ります。
entityファイルはこのテーブルはこんなデータ構造だよ~、を定義するファイルです。

npm run typeorm:entity:create users

// package.json信じたくない人向け
npx ts-node ./node_modules/typeorm/cli entity:create -d src/entities -n users

実行するとsrc/entitiesの下にusers.tsを作ってくれます。
package.jsonを修正したので、src/entitiesに勝手にファイル置いてくれるようになってます。

~~.entity.tsな名前がいいので
user.entity.tsに名前を変えておきます。

カラムを定義していきましょう。
users.entity.ts

import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity()
export class Users {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  firstName: string;

  @Column()
  lastName: string;

  @Column()
  age: number;
}

migrationファイルをつくる(migration:generate)

migrationファイルを作ります。
migrationファイルは、entityファイルに従ってこんなテーブル作るよ~、ファイルです。

npm run typeorm:migration:generate users

// package.json信じたくない人向け
npx ts-node ./node_modules/typeorm/cli migration:generate -d src/migrations -n users

実行するとsrc/migrationsの下に1621866903755-users.tsみたいなファイルができます。
数字の羅列はタイムスタンプです。

migrationファイルの中身を見てみましょう。
1621866903755-users.ts

import {MigrationInterface, QueryRunner} from "typeorm";

export class users1621866903755 implements MigrationInterface {
    name = 'users1621866903755'

    public async up(queryRunner: QueryRunner): Promise {
        await queryRunner.query("CREATE TABLE `users` (`id` int NOT NULL AUTO_INCREMENT, `firstName` varchar(255) NOT NULL, `lastName` varchar(255) NOT NULL, `age` int NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB");
    }

    public async down(queryRunner: QueryRunner): Promise {
        await queryRunner.query("DROP TABLE `users`");
    }

}

up関数にCREATE文、down関数にDROP文ができます。
upは以下に説明するmigrate:runで、downはmigration:revertで実行されます。

テーブルをつくる(migration:run)

migration:runを実行するとテーブルができます。

npm run typeorm:migration:run

// package.json信じたくない人向け
npx ts-node ./node_modules/typeorm/cli migration:run

実行するとこんな感じにでてきます。

> hello-world@0.0.1 typeorm:migration:run C:\work\crush-course\hello-world      
> npx ts-node ./node_modules/typeorm/cli migration:run

query: SELECT * FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_SCHEMA` = 'mydb' AND `TABLE_NAME` = 'migrations'
query: SELECT * FROM `mydb`.`migrations` `migrations` ORDER BY `id` DESC
0 migrations are already loaded in the database.
1 migrations were found in the source code.
1 migrations are new migrations that needs to be executed.
query: START TRANSACTION
query: CREATE TABLE `users` (`id` int NOT NULL AUTO_INCREMENT, `firstName` varchar(255) NOT NULL, `lastName` varchar(255) NOT NULL, `age` int NOT NULL, PRIMARY 
KEY (`id`)) ENGINE=InnoDB
query: INSERT INTO `mydb`.`migrations`(`timestamp`, `name`) VALUES (?, ?) -- PARAMETERS: [1621866903755,"users1621866903755"]
Migration users1621866903755 has been executed successfully.
query: COMMIT

A5M2で見てみると、usersテーブルができます。

初回migration時にはmigrationsというテーブルもできます。
migrationsテーブルは、実行したmigrationファイルのタイムスタンプを履歴で持ってくれます。

これでCLIでテーブルを作ることができました!

さいごに

TypeORM CLIでテーブルを作ってみました。

schema:syncとmigration:revertの説明も入れたかったけど、思ったよりもりもりになったので別記事にします。

この記事を面白いまたは役に立ったと思ってくれた方は是非私のTwitter(@kojimanotech)を
フォローしてくれたらうれしいです!

以上、コジマでした。


NestJSカテゴリの最新記事