Node.js ORM Sequelize 개발(또는 운영) 도중 컬럼이나 테이블 추가 해야 할 때 DB 마이그레이션 하기
Node.js ORM Sequelize 개발(또는 운영) 도중 컬럼이나 테이블 추가 해야 할 때 DB 마이그레이션 하기
Node.js 에서 사용할 수 있는 ORM 에는 Sequelize 가 있습니다.
개발을 하다 보면 컬럼이나 테이블을 추가해야 할 때가 있는데 sequelize.drop() 후에 sequelize.sync() 해주어야 Model 에 설정해둔대로 변경이 적용됩니다. 하지만 drop() 하면 데이터는 모두 삭제되므로 곤란해질 수 있겠죠. 이럴때는 sequelize 에서 제공하는 migration 기능을 이용하면 됩니다.
커맨드라인에서 sequelize 를 실행해야 하므로 먼저 cli에서 실행가능한 sequelize 를 별도로 설치해야 합니다.
sequelize-cli 는 한 번 설치하고 어디서든 사용할 수 있도록 편의를 위해 -g 옵션을 주어 글로벌 모드로 설치해주면 좋습니다.
$ sudo npm install -g sequelize-cli
이제 sequelize 를 초기화 해 주어야 한다. (초기화하면 models 폴더 안에 모든 모델 파일들이 삭제 되고 index.js 만 유지 되는데 이 문제는 어쩌노???)
$ sequelize init
프로젝트 폴더 루트에서 위의 명령 수행으로 프로젝트 폴더안에 기존에는 없었던 config, seeders, migrations 폴더가 생성되었을 것이다. 먼저 VSCODE 와 같은 편집기에서 config 폴더 안에 있는 config.json 파일을 열어서 DB 접속정보를 수정하세요
정상적으로 설치가 되었으면 마이그레이션 작업을 해야하는 프로젝트 폴더로 이동해서 아래의 명령으로 마이그레이션 작업을 생성합니다.
$ sequelize migration:create –name addcolumn
위의 명령 수행으로 migrations 폴더안에 마이그레이션 용 js 파일 하나가 생성되었을 것이다.
migrations 폴더로 이동해보면 위의 명령으로 생성된 파일이 있습니다. 파일명은 년도와 날짜의 숫자로 시작하며 아래와 같습니다.
20191203065619- ….. -migration.js.js
역시 열어서 편집을 해야 합니다.
Products 테이블에 thumbnail 컬럼을 추가하고 싶을땐 아래와 같이 하시면 됩니다.
여기까지 하셨다면 마이그레이션 준비를 다 마친 것입니다. 아래의 명령으로 마이그레이션을 수행할 수 있고 수행할때 –env 옵션을 통해 디비를 선택할 수 있습니다. (config.json 파일에 셋팅해둔 development, production, test 디비 중)
$ sequelize db:migrate –env development
이제 테이블을 열어 확인해보시면 컬럼이 추가된 것을 볼 수 있을것입니다.
* 반대로 컬럼(또는 테이블)을 제거하기 원하면 아래의 명령을 통해 마이그레이션을 취소하면 됩니다.
$ sequelize db:migrate:undo –env development
컬럼을 한개가 아니라 여러개 추가해야 할때는 아래와 같이 하면 되겠습니다.
module.exports = {
up: function (queryInterface, Sequelize) {
return [
queryInterface.addColumn(‘Products’, ‘price’, {
type: Sequelize.STRING(10)
}),
queryInterface.addColumn(‘Products’, ‘description’, {
type: Sequelize.STRING,
})
];
},
down: function (queryInterface, Sequelize) {
return [
queryInterface.removeColumn(‘Products’, ‘price’),
queryInterface.removeColumn(‘Products’, ‘description’)
];
}
};
쿼리문을 그대로 리터럴 방식으로 넣어서 테이블이나 컬럼 추가(수정,삭제 등) 작업을 할 수 도 있습니다.
module.exports = {
up: function (queryInterface, Sequelize) {
var sql = ‘ALTER TABLE Products ADD COLUMN price varchar(255) NOT NULL’;
return queryInterface.sequelize.query(sql, {
type: Sequelize.QueryTypes.RAW
});
},
down: function (queryInterface, Sequelize) {
var sql = ‘ALTER TABLE Products DROP COLUMN price’;
return queryInterface.sequelize.query(sql, {
type: Sequelize.QueryTypes.RAW
});
}
};
[참조]
http://jeonghwan-kim.github.io/sequelize-migration
https://github.com/twolfson/sequelize-cli
https://sequelize.readthedocs.io/en/2.0/docs/models-definition