본문 바로가기
JavaScript/Node.js

Node) Sequelize Migration

by 박채니 2023. 7. 28.
안녕하세요, 코린이의 코딩 학습기 채니 입니다.
개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.

 

Sequelize Migration

- 운영 단계에서 데이터베이스 스키마 변경이 편리

- 직접적인 스키마 변경을 할 순 있지만 번거롭고, 위험도가 높음

 

Sequelize Migration 방법

Migration 생성

 

$ sequelize migration:create 파일명

위 명령어를 작성하면, "타임스탬프-파일명.js" 파일이 생성됩니다.

 

Migration 파일

"use strict";

/** @type {import('sequelize-cli').Migration} */
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');
         */
    },
};

up() 함수에는 마이그레이션 하는 코드, down() 함수에는 롤백하는 코드를 작성해주어 진행해줍니다.

 

users 테이블에 age 컬럼을 추가하는 코드를 작성해보겠습니다.

"use strict";

/** @type {import('sequelize-cli').Migration} */
module.exports = {
    async up(queryInterface, Sequelize) {
        /**
         * Add altering commands here.
         *
         * Example:
         * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
         */

        const tableDefinition = await queryInterface.describeTable("users");
        const promises = [];

        return queryInterface.sequelize.transaction((t) => {
            if (!tableDefinition) {
                promises.push(
                    queryInterface.addColumn("users", {
                        age: {
                            type: Sequelize.INTEGER(),
                            allowNull: false,
                        },
                    })
                );
            }

            return Promise.all(promises);
        });
    },

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

        const tableDefinition = await queryInterface.describeTable("users");
        const promises = [];

        return queryInterface.sequelize.transaction((t) => {
            if (tableDefinition) {
                promises.push(queryInterface.removeColumn("users"));
            }

            return Promise.all(promises);
        });
    },
};

다중 마이그레이션 시 위 코드처럼 배열에 담아 한 번에 처리해줄 수 있고, 단일 마이그레이션 시 배열에 담지 않고 처리해줄 수도 있다.

(일부로 배열에 담음)

 

Migration 진행

 

$ sequelize db:migrate --env development

--env 옵션을 통해 데이터베이스를 선택할 수 있습니다.

 

마이그레이션을 실행하면, DB에 SequelizeMeta 테이블이 생성되고, 히스토리가 기록되는 것을 확인할 수 있습니다.

 

실행된 마이그레이션 파일을 저장해두고,

추후 마이그레이션 요청이 들어왔을 때 SequelizeMeta 테이블에 존재하는 마이그레이션인지 확인 후 존재한다면 건너뛰고, 존재하지 않는다면 실행해 줍니다.

 

따라서, 마이그레이션 파일이 많아도 신규 마이그레이션만 진행됩니다.

 

Migration 취소

 

$ sequelize db:migrate:undo --env development

롤백이 실행되며, SequelizeMeta 테이블에서 해당 마이그레이션 로우는 삭제됩니다.

 

 

✅ 참고한 사이트

https://jeonghwan-kim.github.io/sequelize-migration/