본문 바로가기

과거공부모음

20230308 TIL - seed data만들기

Today I learned

typeorm을 사용해서 seeddata를 만들려면 CLI를 사용해서 migration을 사용해한다고 한다

 

필요한 패키지를 준비하자

npm install -D ts-node tsconfig-paths

 

 

tsconfig-paths는 typeorm cli가 절대경로를 인식하지 못해서 문제가 발생하는 경우가 있다

그래서 임의로 절대경로를 넣어주기 위해

package.json에 스크립트를 추가하자

"typeorm": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js --dataSource ./data-source.ts",
"migration:create": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js migration:create ./src/database/migrations/Migration",
"migration:generate": "npm run typeorm migration:generate ./src/database/migrations/Migration",
"migration:run": "npm run typeorm  migration:run",
"migration:revert": "npm run typeorm migration:revert",

tsconfig-paths를 이용하는걸 볼 수 있다

 

 

세팅이 되었다면 migration 스크립트를 실행해보자

npm run migration:generate

이런식으로 성공 메시지가 뜬다

 

 

migration 파일이 만들어진다!

import { MigrationInterface, QueryRunner } from "typeorm";

export class Migration1678246824920 implements MigrationInterface {
    name = 'Migration1678246824920'

    public async up(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.query(`CREATE TABLE \\`cat\\` (\\`createdDate\\` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), \\`modifiedDate\\` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), \\`deletedDate\\` datetime(6) NULL, \\`idx\\` int NOT NULL AUTO_INCREMENT, \\`name\\` varchar(255) NOT NULL, PRIMARY KEY (\\`idx\\`)) ENGINE=InnoDB`);
    }

    public async down(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.query(`DROP TABLE \\`cat\\``);
    }

}

migration 파일이 만들어졌으면 사용해주면 된다

 

 

up을 실행하려면

npm run migration:run

 

 

down을 실행하려면

npm run migration:revert

 

 

up을 실행해보자

쿼리문이 자동으로 실행되면서 필요한 동작을 한다

 

 

새로운 Colum을 추가하면 다시 generate를 실행해서 파일을 만들고 run을 실행하면 데이터베이스가 자동으로 변경된다

generate를 사용하면서 주의할 점은 generate를 하면 table을 Drop하고 다시 테이블을 만드는 쿼리로 동작할 수 있다 그러기 때문에 만들어진 migration파일을 확인하고 Drop이 들어가서 원하지 않을 때는 create를 이용해서 수동으로 작성해주면 된다

 

 

이제 seeddata를 만들어보자 seeddata를 만들려면 패키지가 더 필요하다

npm install typeorm-extension --save

 

 

database폴더 안에 factories 폴더를 만든다 typeorm-extension이 기본적으로 해당 폴더의 factory파일을 읽는다

// src/database/factories/cats.factory.ts

import { Cat } from 'src/cats/entities/cat.entity';
import { setSeederFactory } from 'typeorm-extension';

export default setSeederFactory(Cat, (faker) => {
  const cat = new Cat();
  cat.name = faker.name.fullName();
  cat.kind = faker.animal.cat();

  return cat;
});
// src/database/seeds/cats.seeder.ts

import { Cat } from 'src/cats/entities/cat.entity';
import { DataSource } from 'typeorm';
import { Seeder, SeederFactoryManager } from 'typeorm-extension';

export default class CatsSeeder implements Seeder {
  async run(
    dataSource: DataSource,
    factoryManager: SeederFactoryManager,
  ): Promise<any> {
    const catsFactory = factoryManager.get(Cat);
    await catsFactory.saveMany(5);
  }
}

5가지의 seeddata가 생성되어있는 결과물을 확인할 수 있다

 

 

이제 프로젝트에 적용시켜봐야겠다

 

 

참고 자료/사이트

TypeORM 0.3에서 migration 해보기

npm: tsconfig-paths

TypeORM 0.3에서 Seeding 하기