삽질의 현장/- TypeScript

TypeScript TypeORM Migration 정리

shovelman 2019. 10. 12. 15:26

TypeORM 사용중 migration 기능을 대충 본것 같아 관련한 기능을 정리해봤다.

모델 변경사항을 데이터 베이스에 동기화해야한다.
일반적으로 데이터베이스에서 데이터를 가져오면
프로덕션에서 스키마를 동기화할 때 사용하는 synchronize: true 는 안전하지 않다.

마이그레이션은 데이터베이스 스키마를 업데이트하고 기존 데이터베이스에 새로운 변경사항을 적용하기 위해
SQL 쿼리가 포함된 단일 파일이다.

    import { Entity, Column, PrimaryGeneratedColum } from "typeorm"

    @Entity()
    export class Post  {
      @PrimaryGeneratedColum()
      id: number;

      @Column()
      title: string;

      @Column()
      text: string
    }

새로운 릴리즈가 만들어짐에 따라 sql query를 수정해야할 일이 생겼다고 가정해보자.

    ALTER TABLE "post" ALTER COLUMN "title" RENAME TO "name";

이 SQL 쿼리를 실행하면 데이터베이스 스키마가 새 코드베이스와 함께 작동할 준비가 된다.
TypeORM은 이러한 SQL 쿼리를 작성하고 필요할 때 실행할 수 있는 'migration'을 제공한다.

새로운 마이그레이션 생성

새 마이그레이션을 작성하기 전에 연결 옵션을 설정하자.

    {
        "type": "mysql",
        "host": "localhost",
        "port": 3306,
        "username": "test",
        "password": "test",
        "database": "test",
        "entities": ["entity/*.js"],
        "migrations": ["migration/*.js"],
        "cli": {
            "migrationsDir": "migration"
        }
    }
  1. "migrations" : typeorm이 지정된 "migration" 디렉토리에서 마이그레이션을 로드할 수 있도록 지정

  2. "cli": { "migrationsDir": "migration" } : "migration" 디렉토리 안에 새 마이그레이션을 생성하도록 지정
    연결옵션을 설정하면 CLI를 사용하여 새 마이그레이션을 만들 수 있다.

     typeorm migration:create -n PostRefactoring

    명령은 호출하면 타임스템프 + -n 뒤 명시한 이름으로 파일이 생성될 것이다.

     import {MigrationInterface, QueryRunner} from "typeorm";
    
     export class PostRefactoringTIMESTAMP implements MigrationInterface {
         async up(queryRunner: QueryRunner): Promise<any> {
    
         }
    
         async down(queryRunner: QueryRunner): Promise<any> { 
    
         }
     }

    up 메서드에서는 마이그레이션을 수행하는 데 필요한 코드가 포함되어야한다.
    down 메서드에서는 마지막 마이그레이션을 되돌리는데 사용된다.
    QueryRunner 객체를 통해 데이터베이스 작업을 실행한다.

     async up(queryRunner: QueryRunner): Promise<any> {
        await queryRunner.query(`ALTER TABLE "post" RENAME COLUMN "title" TO "name"`);
     }
    
     async down(queryRunner: QueryRunner): Promise<any> { 
        await queryRunner.query(`ALTER TABLE "post" RENAME COLUMN "name" TO "title"`); // reverts things made in "up" method
     }

    마이그레이션 실행 및 되돌리기

    마이그레이션을 실행해보자

     typeorm migration:run

    migration:create와 migration:generate 는 .ts 파일을 생성한다.
    migration:run과 migration:revert는 .js 파일에서만 동작한다.
    따라서 명령을 실행하기 전에 typescript 파일을 컴파일 해야한다.
    보통 typeorm과 함께 ts-node를 사용하여 .ts 파일을 실행한다.

     ts-node ./node_modules/typeorm/cli.js migration:run

    해당 명령은 타임스템프 순서대로 모든 마이그레이션을 실행한다.
    (생성된 마이그레이션의 up 메서드로 작성된 모든 SQL 쿼리가 실행된다.)

만약 되돌리고 싶다면, rever 커멘드를 사용하면 된다.

    typeorm migration:revert

마이그레이션 생성

TypeORM은 스키마 변경 사항으로 마이그레이션 파일을 자동으로 생성할 수 있다.

    typeorm migration:generate -n PostRefactoring

직접 쿼리를 작성할 필요가 없다.

마이그레이션 API를 사용하여 마이그레이션 하기

API를 사용하여 데이터베이스 스키마를 변경하기 위해 QueryRunner를 사용할 수 있다.
using migration api to wrtie migration

참고: TypeORM Migration