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가 생성되어있는 결과물을 확인할 수 있다
이제 프로젝트에 적용시켜봐야겠다
참고 자료/사이트
'과거공부모음' 카테고리의 다른 글
20230321 TIL - 구글 비전을 이용한 이미지 라벨링 (0) | 2023.03.21 |
---|---|
20230309 TIL - 여러장의 이미지 업로드 (0) | 2023.03.09 |
20230307 TIL - github에 민감한 파일 올렸다 (0) | 2023.03.07 |
20230306 TIL - S3 파일 업로드 문제 (0) | 2023.03.06 |
20230301 TIL - nestjs typeorm (0) | 2023.03.02 |