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 컬럼을 추가하고 싶을땐 아래와 같이 하시면 됩니다.

 

 

‘use strict’;
module.exports = {
up: (queryInterface, Sequelize) => {
returnqueryInterface.addColumn(‘Products’, ‘thumbnail’, { type:Sequelize.STRING(200) });
},
down: (queryInterface, Sequelize) => {
returnqueryInterface.removeColumn(‘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