(Node.js) Sequelize Migration

Mirrer·2022년 9월 12일
0

Node.js

목록 보기
8/12
post-thumbnail

Migration

Migration은 기존 Database를 다른 상태, 또는 그 반대로 전송

Migration은 큰 의미로 "한 운영환경으로부터 다른 운영환경으로 옮기는 작업"을 뜻한다.

SequelizeMigration을 지원하는데, 이를 통해 모델의 데이터 형식, 컬럼 추가 및 삭제, 테이블 추가 및 제거...등등 운영중인 서버의 Database 변경 작업을 가능하게 한다.

Migration을 사용해 Database를 수정하는 방법은 다음과 같다.


Migration 생성

아래 npm명령어를 통해 Migration 파일을 생성한다.

npx sequelize migration:create --name useraddcolumn(생성 migration name)

이후 디렉토리에 확인해보면 다음과 같이 타임스탬프가 적용된 .js 파일이 생성된 것을 확인할 수 있다.


Migration테이블을 수정할 수 있는 up, down 기능을 제공하며, 파일의 기본 형태는 다음과 같다.

  • up : Migration을 통해 수정할 모델을 작성하는 소스코드 로직

테이블 생성, 컬럼 추가...등등 DB의 속성이 변경 되는 기능을 작성

  • down : Migration을 통해 Rollback을 수행하는 소스코드 로직

컬럼 삭제, 테이블 변경...등등 이전 속성으로 Rollback 되는 기능을 작성

// migrations/20220912125846-useraddcolumn
'use strict';

module.exports = {
  async up (queryInterface, Sequelize) => {
    /**
     * Add altering commands here.
     *
     * Example:
     * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
     */
  },

  async down (queryInterface, Sequelize) => {
    /**
     * Add reverting commands here.
     *
     * Example:
     * await queryInterface.dropTable('users');
     */
  }
};

Migration 작성

테이블 생성

테이블을 생성할 때는 createTable() 함수를 사용한다.

queryInterface.createTable(테이블명, {컬럼명: {데이터속성: 옵션...}})

module.exports = {
  async up (queryInterface, Sequelize) => {
    await queryInterface.createTable('posts', {
      title: {
        type: Sequelize.INTEGER
        allowNull: false,        
        primaryKey: true,        
      },
      desc: {
        type: Sequelize.STRING,
        allowNull: false
      }
   });
 }

테이블 삭제

테이블을 삭제할 때는 dropTable() 함수를 사용한다.

queryInterface.dropTable('테이블명')

module.exports = {
  async up (queryInterface, Sequelize) => {
    await queryInterface.dropTable('posts'),
  });
}

테이블 컬럼 추가

테이블에 컬럼을 추가할 때는 addColumn() 함수를 사용한다.

queryInterface.addColumn(테이블명, 추가 컬럼명, {데이터속성: 옵션...})

module.exports = {
  async up (queryInterface, Sequelize) => {
    await queryInterface.addColumn("posts", "title", {
      type: Sequelize.STRING,
      allowNull: false,
    }),
  });
}

테이블 컬럼 삭제

테이블에 컬럼을 삭제할 때는 removeColumn() 함수를 사용한다.

queryInterface.removeColumn(테이블명, 제거 컬럼명)

module.exports = {
  async up (queryInterface, Sequelize) => {
    await queryInterface.removeColumn("posts", "title"),
  });
}

테이블 컬럼 다중 추가 및 삭제

테이블에 여러 컬럼을 추가, 삭제할 때는 배열에 담아 return한다.

return [ queryInterface.addColumn(테이블명, 추가 컬럼명, {데이터속성: 옵션...}), queryInterface.addColumn(테이블명, 추가 컬럼명, {데이터속성: 옵션...}), ... ]

module.exports = {
  async up (queryInterface, Sequelize) => {
    await [
      queryInterface.addColumn("posts", "title", {
        type: Sequelize.STRING,
        allowNull: false,
      }),
      queryInterface.addColumn("posts", "desc", {
        type: Sequelize.STRING,
      }),
    ]        
  });
}

테이블 컬럼명 변경

테이블 컬럼명을 변경할 때는 renameColumn() 함수를 사용한다.

queryInterface.renameColumn(테이블명, 변경 컬럼명, 변경할 컬럼명)

module.exports = {
  async up (queryInterface, Sequelize) => {
    await queryInterface.renameColumn("posts", "desc", "description"),   });
}

테이블 컬럼 속성값 변경

테이블 컬럼의 속성값을 변경할 때는 changeColumn() 함수를 사용한다.

queryInterface.changeColumn(테이블명, 컬럼명, {데이터속성: 옵션...})

module.exports = {
  async up (queryInterface, Sequelize) => {
    await queryInterface.changeColumn("posts", "desc", {
      type: Sequelize.STRING,
      allowNull: false,
    }
  });
}

Migration 적용

변경 한 Migration은 아래 npm명령어를 통해 Database에 적용한다.

npx sequelize db:migrate

이 때 --env 속성을 사용하면 각각의 개발(development), 테스트(test), 프로덕션(production)Database에 개별적으로 Migration을 적용 시킬 수 있다.

참고로 --env 속성의 default개발(development)용 DB로 설정 되어 있다.

npx sequelize db:migrate --env development
npx sequelize db:migrate --env test
npx sequelize db:migrate --env production

Migration Rollback

Migration Rollback은 아래 npm명령어를 통해 사용하며, --env 속성 사용 가능하다.

적용과 마찬가지로 --env 속성의 default개발(development)용 DB이다.

npx sequelize db:migrate:undo
npx sequelize db:migrate --env development
npx sequelize db:migrate --env test
npx sequelize db:migrate --env production

또한 모든 Migration전체 Rollback은 아래 npm명령어를 통해 사용한다.

npx sequelize db:migrate:undo:all

참고 자료

Migrations | Sequelize
Sequelize 마이그레이션 - 김정환블로그

profile
memories Of A front-end web developer

0개의 댓글