NestJS TypeORM(^0.2.45) Migration DB 생성 및 첫 Migration진행 -1
위 블로그 글은 TypeORM ^0.2.45버전을 기준으로 작성한 글입니다.
npm 설치시 typeorm은 ^0.2.45버전 입니다.
// src/db/ormconfig.ts
import { TypeOrmModuleOptions } from '@nestjs/typeorm';
require('dotenv').config();
export const typeOrmModuleOptions: TypeOrmModuleOptions = {
type: 'postgres',
host: process.env.PG_HOST,
port: +process.env.PG_PORT,
username: process.env.PG_USERNAME,
password: process.env.PG_PASSWORD,
database: process.env.PG_DATABASE,
autoLoadEntities: true,
synchronize: process.env.PG_CHANGE === 'true',
};
export const OrmConfig = {
...typeOrmModuleOptions,
migrationsTableName: 'migrations',
entities: ['dist/**/*.entity.js'],
migrations: ['dist/db/migrations/*.js'],
cli: {
migrationsDir: './src/db/migrations',
},
};
export default OrmConfig;
# .env
PG_HOST="localhost"
PG_PORT=5434
PG_USERNAME="alex"
PG_PASSWORD="password"
PG_DATABASE="postgres"
PG_CHANGE="false"
package.json파일을 아래와 같이 수정합니다.
"scripts": {
"build": "nest build",
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
"start": "nest start",
"start:dev": "nest start --watch",
"start:debug": "nest start --debug --watch",
"start:prod": "node dist/main",
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
"test": "jest",
"test:watch": "jest --watch",
"test:cov": "jest --coverage",
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
"test:e2e": "jest --config ./test/jest-e2e.json",
"typeorm": "node -r tsconfig-paths/register -r ts-node/register ./node_modules/typeorm/cli.js --config src/db/ormconfig.ts",
"migrate:create": "node -r tsconfig-paths/register -r ts-node/register ./node_modules/typeorm/cli.js --config src/db/ormconfig.ts \"migration:create\" -n",
"migrate:up": "node -r tsconfig-paths/register -r ts-node/register ./node_modules/typeorm/cli.js --config src/db/ormconfig.ts migration:run",
"migrate:down": "node -r tsconfig-paths/register -r ts-node/register ./node_modules/typeorm/cli.js --config src/db/ormconfig.ts migration:revert"
},
typeorm, migrate:create, migrate:up, migrate:down을 추가해 줍니다.
migrate script를 입력하면(제목 포함) 자동으로 ts파일이 생성 되는것을 알수 있습니다.
// src/db/migrations/1682304539008-First.ts
import { MigrationInterface, QueryRunner } from 'typeorm';
export class First1682304539008 implements MigrationInterface {
// migration 쿼리문 작성
public async up(queryRunner: QueryRunner): Promise<void> {}
// migration 취소 쿼리문 작성
public async down(queryRunner: QueryRunner): Promise<void> {}
}
// src/db/migrations/1682304539008-First.ts
import { MigrationInterface, QueryRunner } from 'typeorm';
export class First1682304539008 implements MigrationInterface {
// migration 쿼리문 작성
public async up(queryRunner: QueryRunner): Promise<void> {
// 간단한 users테이블 생성
await queryRunner.query(
`CREATE TABLE users(
id SERIAL PRIMARY KEY,
"userId" VARCHAR(255) NOT NULL,
email VARCHAR NOT NULL,
nickname VARCHAR NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
)`,
);
}
// migration 취소 쿼리문 작성
public async down(queryRunner: QueryRunner): Promise<void> {
// users테이블 삭제
await queryRunner.query(`DROP TABLE users`);
}
}
위 와 같이 쿼리문을 작성해 줍니다.
수정후 build 진행
migrate:up을 진행시 Postgres데이터베이스에 users테이블이 생성되고 migrations테이블에 migrate이력이 저장된 것을 알수있습니다.
반대로 migrate:down을 진행시 users테이블을 지워지고 migrations테이블의 레코드도 지워진 것을 확인할수 있습니다.
gitHub : https://github.com/Alex-Choi0/nestjs_typeorm0.2.45_migration_example.git
댓글
댓글 쓰기