Migration
은 기존Database
를 다른 상태, 또는 그 반대로 전송
Migration
은 큰 의미로 "한 운영환경으로부터 다른 운영환경으로 옮기는 작업"
을 뜻한다.
Sequelize
는 Migration
을 지원하는데, 이를 통해 모델의 데이터 형식, 컬럼 추가 및 삭제, 테이블 추가 및 제거...등등 운영중인 서버의 Database
변경 작업을 가능하게 한다.
Migration
을 사용해 Database
를 수정하는 방법은 다음과 같다.
아래 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');
*/
}
};
테이블을 생성할 때는 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
은 아래 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
은 아래 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