내일배움캠프 TIL (230102): Sequelize 컬럼 추가 및 삭제 시 migration 방법

Jiumn·2023년 1월 2일
0

Sequelize 컬럼 추가 및 삭제 시 migration

sequelize로 컬럼을 추가하거나 삭제할 때는 다음과 같은 과정이 필요하다.

  1. migration 파일 생성

    $ npx sequelize migration:create --name 변경하려는 모델명
  2. migration 파일 수정

    생성된 migration 파일을 보면 up, down 영역이 나눠져 있다.

    up은 업데이트를 하고 싶은 내용 (DB, 컬럼 추가/삭제 등)
    down은 롤백을 하고 싶은 내용을 적어주면 된다.

  3. model 파일 내용 변경

    model 안에 있는 내용도 migration과 일치하도록 변경해야 한다.

  4. migration 명령어 입력

    $ npx sequelize db:migrate

주의사항

위와 같은 과정을 수행해서 특정 컬럼을 삭제했는데도 삭제가 되지 않았다.

그런데 migration 명령어를 작성하니 No migration were excuted, database schema was already up to date라는 문구가 계속 떴다.

migration 파일을 잘못 작성했을 것 같다는 생각이 들어서 다시 살펴봤다.

// 잘못 작성한 예시
module.exports = {
  async up(queryInterface, Sequelize) {
    await queryInterface.removeColumn("laundries", "status", {
      type: Sequelize.INTEGER,
    });
  },

up에 작성된 내용에 removeColumn 명령어를 입력한 것까지는 맞았는데 type: Sequelize.INTEGER와 같은 데이터 타입 속성을 넣어줘서 수행이 정상적으로 안된 것 같다.

migration 파일을 새롭게 생성하고 데이터 타입 지정 코드를 빼니까 정상적으로 삭제가 됐다.

그런데 remove를 up에 쓰는 게 좀 이상한 것 같기도 해서 추가로 글을 찾아봤다.
여러 블로그를 돌아보다가 결국 sequelize 공식문서에 안착.

// sequelize 공식 문서 내용
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Person', {
      name: Sequelize.DataTypes.STRING,
      isBetaMember: {
        type: Sequelize.DataTypes.BOOLEAN,
        defaultValue: false,
        allowNull: false
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Person');
  }
};

일반적으로 우리가 롤백을 하는 경우는 기존에 있던 것을 삭제하는 것이므로 down
새로운 것을 생성할 때는 up

그런데 일단 removeColumnup에 써도 실행은 된다... 어쨌든 롤백이 아니라 새로운 버전으로 인식해서 상관이 없는 걸가? 어쨋든 다음부터는 삭제는 down에 쓰는 걸로...

sequelize가 migration 파일을 사용하면 쉽게 롤백이 된다는 점이 편리하기는 하지만 컬럼 내용이 바로 수정이 안 되고 삭제를 한 후 추가하는 과정을 거쳐야 하니 번거롭다는 생각이 든다.


Sequelize 자주 사용하는 명령어들

  • 테이블 새로 생성
$ npx sequelize model:generate --name user --attributes name:string,email:string 
// attributes 뒤는 예시
  • 테이블 새로 생성 후 migration
$ npx sequelize migration:create --name 모델명
profile
Back-End Wep Developer. 꾸준함이 능력이다. Node.js, React.js를 주로 다룹니다.

0개의 댓글