sequelize로 컬럼을 추가하거나 삭제할 때는 다음과 같은 과정이 필요하다.
migration 파일 생성
$ npx sequelize migration:create --name 변경하려는 모델명
migration 파일 수정
생성된 migration 파일을 보면 up
, down
영역이 나눠져 있다.
up
은 업데이트를 하고 싶은 내용 (DB, 컬럼 추가/삭제 등)
down
은 롤백을 하고 싶은 내용을 적어주면 된다.
model 파일 내용 변경
model 안에 있는 내용도 migration과 일치하도록 변경해야 한다.
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
그런데 일단 removeColumn
을 up
에 써도 실행은 된다... 어쨌든 롤백이 아니라 새로운 버전으로 인식해서 상관이 없는 걸가? 어쨋든 다음부터는 삭제는 down
에 쓰는 걸로...
sequelize가 migration 파일을 사용하면 쉽게 롤백이 된다는 점이 편리하기는 하지만 컬럼 내용이 바로 수정이 안 되고 삭제를 한 후 추가하는 과정을 거쳐야 하니 번거롭다는 생각이 든다.
$ npx sequelize model:generate --name user --attributes name:string,email:string
// attributes 뒤는 예시
$ npx sequelize migration:create --name 모델명