LoginSignup
0
0

NestJSでMySQLを使う

Posted at

参考資料

https://docs.nestjs.com/techniques/database
https://qiita.com/Aurum64/items/f5962bd2a643447dbef9
https://typeorm.io/data-source
https://qiita.com/t-yama-3/items/fa2113fcabf84e0a20e6

使用技術

  • Nest.js
  • TypeORM@0.3
  • MySQL

下記を実行してる状態です
nest new sample

ライブラリインストール

npm install @nestjs/typeorm typeorm mysql2

docker-composeでMySQLのコンテナを立ち上げ

docker-compose.yml
version: '3.8'

services:
  mysql:
    image: mysql:8.0
    container_name: mysql
    volumes:
      - ./mysql-data:/var/lib/mysql
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: test
      MYSQL_DATABASE: test
      MYSQL_USER: test
      MYSQL_PASSWORD: test
docker-compoes up -d

MySQLでDBが作成されていることを確認

docker-compose exec mysql bash

> mysql -u test -p
> test # パスワードを入力する

> show databases;
> use test;
> show tables;
# テーブルがないことを確認する

エンティティ作成

nest g resource user
src/user/entities/user.entity.ts
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';

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

  @Column()
  firstName: string;

  @Column()
  lastName: string;

  @Column({ default: true })
  isActive: boolean;
}

DataSource作成

data-source.ts
import { DataSource } from 'typeorm';
import { User } from './user/entities/user.entity';

export const AppDataSource = new DataSource({
  type: 'mysql',
  host: 'localhost',
  port: 3306,
  username: 'test',
  password: 'test',
  database: 'test',
  synchronize: true,
  entities: [User],
});

DB接続

app.module.ts
import { AppDataSource } from './data-source';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserModule } from './user/user.module';

@Module({
  imports: [TypeOrmModule.forRoot(AppDataSource.options), UserModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

テーブルが作成されていることを確認

npm run start:dev
show tables;
describe uesr;
+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id        | int          | NO   | PRI | NULL    | auto_increment |
| firstName | varchar(255) | NO   |     | NULL    |                |
| lastName  | varchar(255) | NO   |     | NULL    |                |
| isActive  | tinyint      | NO   |     | 1       |                |
+-----------+--------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)

migration導入

data-source.ts
import { DataSource } from 'typeorm';
import { User } from './user/entities/user.entity'; // entityファイル

export const AppDataSource = new DataSource({
  type: 'mysql',
  host: 'localhost',
  port: 3306,
  username: 'test',
  password: 'test',
  database: 'test',
  synchronize: false, // 同期をオフにする
  logging: true,
  entities: [User],
  migrations: ['dist/migration/*.js'],
});

エラーがあった場合

No changes in database schema were found - cannot generate a migration. To create a new empty migration use "typeorm migration:create" command

上記のエラーがあった場合はschema:dropする

npm run migration:revert # マイグレーションのバージョンを戻す
npm run schema:drop
# もし、マイグレーションファイルがある場合は削除する

# 一応サーバーを立ち上げ直す
npm run start:dev

マイグレーションファイル作成

npm run migration:generate --name=UserMigration

# 作れていることを確認する
npm run migration:show

# -> []になっていたらOK

テーブル作成

npm run migration:run


再度、MySQLでDBが作成されていることを確認する。
もしうまくいかない場合は、下記について調べてみると良いかもしれません。

0
0
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
0
0