はじめに
コジマです。
【NestJS/TypeORM/MySQL】DBに接続してデータを取得する
このときにはテーブルを手動で作ったけど、今回はCLIで作ってみよう。ってやつです。
やること
- ormconfig.jsonをつくる
- ts-nodeをインストール
- package.jsonを修正
- entityファイルをつくる(entity:craete)
- migrationファイルをつくる(migration:generate)
- テーブルをつくる(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)を
フォローしてくれたらうれしいです!
以上、コジマでした。