마이그레이션(2) 정리!!

김현진·2020년 7월 28일
1

2번째 글입니다.

그 다음으로 알아볼 폴더는 models라는 폴더를 알아볼께여(주인공 마이그레이션은 나중에)

시퀄라이즈에서 model은 데이터베이스 테이블명이랑 같다고 보시면 됩니다.

models안에는 model(데이터베이스 테이블)들이 들어 있는 폴더입니다.
(models 안에는 기본적으로 index.js 파일이 있습니다. 각 폴더에서 중요한 파일을 index.js 파일이라고 생각하시면 됩니다.)

models 안에 index.js파일 내용은 따로 다루지 않겠습니다.

그러면 테이블들을 한번 만들어 볼까요?

(모델을 테이블으로 총칭하겠습니다.)

공식문서에 있는 내용들을 가지고 test 해보겠습니다.

일단 Users라는 테이블을 하나 만들어 보겠습니다

터미널 창을 여시고

npx sequelize-cli model:generate --name User --attributes firstName:string,lastName:string,email:string

너무 기네요. 조금씩 잘라서 볼까요?

일단 익숙한 npx sequelize-cli => 이부분은 생략하겠습니다. 계속해서 설명했으니

model:generate (테이블을 생성할꺼야)

--name User( 테이블 이름은 User라는걸로 실제 데이터베이스 테이블에는 복수형이 생깁니다. Users)

-- attributes firstname: string ( 컬럼명은 firstname이고 데이터타입은 string을 받을꺼야 )

뒤에 나머지 컬럼들 설명은 생략하겠습니다.(그 밖에 데이터타입 boolean, integer, datetime ...)

후 좋습니다.

그러면 migration 폴더에 파일이 하나 생겼고, models 폴더에 user.js라는 파일이 생겼습니다.(user.js 파일 내용도 다루지 않겠습니다.)

/migration xxxxxxxx: 날짜,시간

XXXXXXXXXXXXXX-create-user.js

아직은 테이블이 생성이 된게 아니고

터미널창에

npx sequelize-cli db:migrate

를 실행 하면 됩니다.

=> 이때 만약 error가 발생한다면 데이터베이스를 만들지 않아서 뜰 error일 경우가 큰데여

그 해법은 npx sequelize-cli db:create 실행하면 저희가 config.json폴더에서 설정했던 되로

데이터베이스가 생길꺼에요.(이 과정에서 또 알람이 뜰 경우는 데이터베이스 비밀번호가 맞지않아서 일 경우가 큽니다.)

생성 후

npx sequelize-cli db:migrate

를 실행하면 테이블이 Users라는 테이블이 생겼을껀데요.

확인방법은 sql문을 쳐서 확인해도 되고 mySQL워크벤치를 이용하면 빠르게 확인 하실 수 있습니다.

그런데 만약 user 테이블에 컬럼 하나를 더 추가를 하고 싶으면 어떻게 해야될까요?

models안에 있는 user.js파일을 바꾸면 될까요? No No

어떻게 추가하는지 한번 알아보겠습니다.

터미널을 켠 다음

  npx sequelize migration:create --name addColumn

을 실행 하세요 뒤에 부분은 파일이름을 적어보았습니다.

그러면 migration 폴더안에

  xxxxxxxxx-addColumn.js  

파일이 생겼을꺼에요.

 /migration/xxxxxxxx-addColumn.js

'use strict';

module.exports = {
  up: async (queryInterface, Sequelize) => {
    /**
     * Add altering commands here.
     *
     * Example:
     * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
     */
   
  },

  down: async (queryInterface, Sequelize) => {
    /**
     * Add reverting commands here.
     *
     * Example:
     * await queryInterface.dropTable('users');
     */
    
  }
};

코드 블록이 마음에 안드네요 ㅜㅜ

파일을 보시면 up객체와 down객체가 있다는것을 알수 있을겁니다.

up객체에는 내가 필요로 하는 요구사항을 적으면 됩니다.

저는 Users라는 테이블에 address라는 컬럼명을 추가를 할꺼에요.

up 객체에 추가를 하면 되겠죠??

공식문서를 참조하여 연습을 해보세요.


  up: async (queryInterface, Sequelize) => {
    /**
     * Add altering commands here.
     *
     * Example:
     * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
     */

    return queryInterface.addColumn(
      'users',
      'address',
      Sequelize.STRING
    )
  }

이렇게 만든신 후 터미널창에 (up 객체부분만 복사해서 가져왔습니다.)

npx sequelize-cli db:migrate

실행하면 됩니다.

그리고 실제 컬럼이 추가가 되었는지 확인을 해보시면 됩니다.

down 객체에 대해서 한번 알아보겠습니다.

rollback기능 이라고 생각하시면 됩니다. (이전 상태로 되돌릴꺼야)

저는 방금 추가를 했으니 이전 상태로 되돌릴려면 해당컬럼을 삭제하면 되겠죠??


down: async (queryInterface, Sequelize) => {
    /**
     * Add reverting commands here.
     *
     * Example:
     * await queryInterface.dropTable('users');
     */

    return queryInterface.removeColumn('users', 'adderss')
  }
};

이렇게 작성하신 뒤 터미널창에 (return 꼭 적어줘야 되도라고요 ㅎㅎ)

npx sequelize db:migrate:undo 

이전 상태로 되돌아갑니다.

작성 하실때는 up, down 객체를 한번에 작성해주시면 됩니다.

업데이트할때는

npx sequelize-cli db:migrate

되돌릴때는

npx sequelize db:migrate:undo 

아까 만들었던 컬럼이 삭제가 되겠죠? ㅎㅎ

편의상 sync()로 작성하는 방법도 있지만 이전 기록들을 관리하지 못합니다. ㅠㅠ

추가로 관계설정들을 다루지 못했는데요 주말시간을 이용해 3편을 적어보겠습니다.

migrtion의 특징들을 제가 이해한대로 한번 적어보겠습니다.

  1. 스키마를 변경하기위해(테이블 이름, 테이블 제거 등등)

  2. git의 버전관리 하는것과 비슷하다.(commit기록들이 migrtion 폴더에 남는 느낌?)

  3. migrations 문서를 작성해두면 좋은게 나중에 문제가 생겼을 때 롤백을 할 수 있다.

  4. 내용을 변경하기위해 테이블내용을 직접적으로 바꾸지 말자.

profile
기록의 중요성

0개의 댓글