Node.js의 대표적인 ORM(Object-Relation Mapping)인 Sequelize는 Schema를 쉽게 구성할 수 있고 MySQL 같은 많은 RDBMS 지원한다.
Model을 설정하고 나서 운영중인 서버에서 모델의 데이터 형식, 컬럼 추가, 제거, 테이블 추가, 테이블 제거와 같은 DB 변경 작업시에 Sequelize Migration을 사용한다.
이 글에선 MySQL과 함꼐 사용한다.
자세한 내용이 필요할 땐 Sequelize 공식문서
npx sequelize init
sequelize init 명령어를 실행하면 아래와 같이 몇개의 폴더가 생성된다.
|-- config
|-- migrations
|-- models
|-- seeders
아래 명령어를 실행시켜 migration 파일을 생성 한다.
sequelize migration:create --name
// ./migrations/20221010-backup.js
타임스탬프와 설정해준 이름과 함께 파일이 만들어지고 기본 구조는
module.exports = {
async up(queryInterface, Sequelize) {
//Add altering commands
},
async down(queryInterface, Sequelize) {
//Add reverting commands
}
up => 마이그레이션, down => 롤백 기능을 담당한다.
컬럼 추가, 테이블 생성등 마이그레이션 할 내용을 up에, 롤백할 내용을 down에 작성하면 된다.
// ./models/user.js
{
email: {
type: DataTypes.STRING(30),
allowNull: false,
unique: true,
}
email column이 있는 User Model에서 name 컬럼을 추가하고 싶다
module.exports = {
async up(queryInterface, Sequelize) {
return queryInterface.addColumn('users', 'name', {
type: Sequelize.DataTypes.STRING(20),
allowNull: false,
})
}
async down(queryInterface, Sequelize){
return queryInterface.removeColumn('users', 'name')
}
}
여러개의 컬럼을 한번에 추가하고싶을때 Promise.all()을 사용한다
async up(queryInterface, Sequelize) {
return Promise.all([
queryInterface.addColumn('users', 'email', {
type: Sequelize.STRING(50),
allowNull: false,
}),
queryInterface.addColumn('users', 'password', {
type: Sequelize.STRING(50),
allowNull: false,
}),
])
}
모델에 대한 설정이 끝나면 아래 명령어로 MySQL으로 이식 가능하다.
npx sequelize-cli db:migrate
npx sequelize-cli db:migrate:undo
npx sequelize-cli db:migrate:undo:all