본문 바로가기

Nodejs/Sequelize

Sequelize migration

반응형

 

 

Manual | Sequelize

Migrations Just like you use version control systems such as Git to manage changes in your source code, you can use migrations to keep track of changes to the database. With migrations you can transfer your existing database into another state and vice ver

sequelize.org

 

0. npx 명령어 실행 시 Unable to resolve sequelize package ~.라고 뜬다면 package.json이 있는 경로에서 실행 할 것. 

 

1. 모델 정의 또는 수정

 npx sequelize model:generate --name [모델명] --attributes firstName:string,lastName:string,email:string

 

'use strict';
module.exports = {
  async up(queryInterface, Sequelize) {
    await queryInterface.createTable('log_mng', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      username: {
        type: Sequelize.STRING
      },
      ip: {
        type: Sequelize.STRING
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  async down(queryInterface, Sequelize) {
    // await queryInterface.dropTable('log_mng');
  }
};

 

 

2. 기존 테이블에 컬럼 추가 및 변경

npx sequelize migration:create --name [파일명]

 

- 단일 컬럼 추가 / 삭제

'use strict';

module.exports = {
  /**
   * 컬럼 추가
   * @param {*} queryInterface 
   * @param {*} Sequelize 
   * @returns 
   */
  async up(queryInterface, Sequelize) {
    return queryInterface.addColumn("log_mng", "partname", {
      type: Sequelize.STRING(200),
      comment: '부서명'
    });
  },

  /**
   * 컬럼 삭제
   * @param {*} queryInterface 
   * @param {*} Sequelize 
   * @returns 
   */
  async down(queryInterface, Sequelize) {
    return queryInterface.removeColumn("log_mng", "partname");
  }
};

 

- 여러 컬럼 추가 / 삭제

'use strict';

module.exports = {
  /**
    * 컬럼 추가
    * @param {*} queryInterface 
    * @param {*} Sequelize 
    * @returns 
    */
  async up(queryInterface, Sequelize) {
    return queryInterface.sequelize.transaction((t) => {
      return Promise.all([
        queryInterface.addColumn("los_term", "term_gbn", {
          type: Sequelize.STRING(200),
          comment: '용어_구분'
        }, { transaction: t }),
        queryInterface.addColumn("los_term", "unit", {
          type: Sequelize.STRING(200),
          comment: '단위'
        }, { transaction: t })
      ])
    });
  },

  /**
   * 컬럼 삭제
   * @param {*} queryInterface 
   * @param {*} Sequelize 
   * @returns 
   */
  async down(queryInterface, Sequelize) {
    return queryInterface.sequelize.transaction((t) => {
      return Promise.all([
        queryInterface.removeColumn('los_term', 'term_gbn', { transaction: t }),
        queryInterface.removeColumn('los_term', 'unit', { transaction: t })
      ])
    })
  }
};

- 컬럼 수정 / 취소

'use strict';

module.exports = {
  up: async (queryInterface, Sequelize) => {
    return queryInterface.changeColumn("tb_name", "col_name", {
      type: Sequelize.STRING,
      comment: '속성_ID'
    });
  },

  down: async (queryInterface, Sequelize) => {
    return queryInterface.changeColumn("tb_name", "col_name", {
      type: Sequelize.STRING,
      comment: '이전_속성_ID'
    });
  }
};

- 컬럼 외래키 추가 / 제거

'use strict';

module.exports = {
  up: async (queryInterface, Sequelize) => {
    return queryInterface.addConstraint("tb_name", {
      fields: ['fk_col_id'],
      type: 'foreign key',
      name: 'fk_name',
      references: {
        table: 'p_tb_name',
        field: 'id'
      }
      // onDelete: 'cascade',
      // onUpdate: 'cascade'
    });
  },

  down: async (queryInterface, Sequelize) => {
    return queryInterface.removeConstraint("tb_name", "fk_name");
  }
};

 

 

3. 마이그레이션 실행

npx sequelize db:migrate

 

dotenv 모듈을 사용해서 config 파일에 입력된 DB 정보로 migrate

- 개발 DB

npx sequelize db:migrate --env development

- 운영 DB

npx sequelize db:migrate --env production

 

* migration한 상태에서 내용 수정

1. migration 되돌리기. undo 실행 시 각 파일의 down에 정의된 코드가 실행 됨.

   No executed migrations found. 라는 문구가 나오면 모두 되돌아 간 것.

npx sequelize db:migrate:undo // 작업 취소
npx sequelize db:migrate:undo:all //작업 모두 되돌리기

 

2. migration 파일과 model의 내용을 맞춘다.

3. migration 실행

npx sequelize db:migrate

 

반응형