nestjs TypeORM generate

이건선·2023년 4월 25일
0

해결

목록 보기
29/48
post-custom-banner

시작하기


1. 해당 경로에 config 폴더와 파일을 생성

  1. entities 폴더 생성 및 각각 Entity 작성한다. 그리고 migration:generate시에 생성되는 파일을 담기위해 폴더 생성한다.

  2. typeorm-cli.config.ts에 내용 작성

import { DataSource } from 'typeorm';
import { ConfigService } from '@nestjs/config';
import { config } from 'dotenv';

config();

const configService = new ConfigService();

export default new DataSource({
  type: 'mysql',
  host: configService.get<string>('DB_HOST'),
  port: configService.get<number>('DB_PORT'),
  username: configService.get<string>('DB_USERNAME'),
  password: configService.get<string>('DB_PASSWORD'),
  database: configService.get<string>('DB_NAME'),
  entities: ['src/entities/*.ts'],
  migrations: ['src/migrations/*.ts'], // generate한 파일을 직접 지정해 줘도 된다
  migrationsTableName: 'migrations',
});
  1. 아래 설정으로 Entity를 데이터베이스와 연결하고 Entity를 이용해 초기 table을 생성 할 것임
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { Users } from './entities/Users';
import { ConfigModule, ConfigService } from '@nestjs/config';

@Module({
  imports: [
    ConfigModule.forRoot({ isGlobal: true }),
    TypeOrmModule.forRootAsync({
      inject: [ConfigService],
      useFactory: (configService: ConfigService) => ({
        type: 'mysql',
        host: configService.get<string>('DB_HOST'),
        port: configService.get<number>('DB_PORT'),
        username: configService.get<string>('DB_USERNAME'),
        password: configService.get<string>('DB_PASSWORD'),
        database: configService.get<string>('DB_NAME'),
        entities: [Users],
        synchronize: false,
        // !!! synchronize는 비어있는 데이터 베이스에 데이터 입력시
		// ture로 사용해서 데이터 베이스 테이블을 생성하고
        // 다시 false로 돌려놓는다. !!!
      }),
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
  1. synchronize: true인 상태로 Entity를 데이터 베이스에 적용하기
npm run start:dev
  1. synchronize: false로 돌려놓기,
  1. 가장 중요한 package.json 수정하기
{
...

"scripts": {

...

    "typeorm": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js --dataSource ./src/config/typeorm-cli.config.ts",
    "migration:generate": "npm run typeorm migration:generate ./src/migrations/migrations",
    "migration:run": "npm run typeorm  migration:run",
    
...
    		}
...
}

처음에 설정했던 config 폴더의 typeorm-cli.config.ts위치가 다르다면 "typeorm"의 --dataSource ./src/config/typeorm-cli.config.ts" 위치를 수정하면 된다.

만들었던 migrations폴더위치가 다르면 "migration:generate"의 ./src/migrations/migrations 코드를 바꿔주면 된다. 현재 폴더의 위치는 ./src/migrations다

  1. 변경 사항이 존재하는 entitiy를 수정한다.

  2. 변경사항이 존재해야만 migration:generate이 정상적으로 실행된다.

npm run migration:generate
  1. migrations 폴더에 파일이 자동으로 생성된다. 그리고 아래 cli를 실행하면 entitiy의 변경 사항이 데이터 베이스에 적용된다.
npm run migration:run

주의

* 변경사항이 존재하지 않으면 migration:generate 실행되지 않음
* synchronize 옵션은 항상 신경쓰자
* npm run migration:run 시에 충돌이 발생할 수 있으므로 Migrations 파일의 충돌하는 부분을 수정하자 

참고 https://whyhard.tistory.com/m/59

profile
멋지게 기록하자
post-custom-banner

0개의 댓글