Sequelize(9)_명령어로 외래키 설정

차분한열정·2021년 4월 7일
0

Sequelize 튜토리얼

목록 보기
9/14

sequelize-cli로 foreign key를 설정하는 것도 가능하다. 잠깐 migrations 디렉토리 안을 보자.

이 각각의 파일 중에서 foreign key 설정을 해줘야 하는 것들을 아래와 같이 수정하면 된다.

1. ()-create-scholarship-account.js

'use strict';
module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable('ScholarshipAccounts', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER,
      },
      accountNum: {
        type: Sequelize.STRING,
      },
      validDate: {
        type: Sequelize.DATE,
      },
      balance: {
        type: Sequelize.INTEGER,
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE,
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE,
      },
      student_ID: { //
        references: {
          model: 'Students',
          key: 'id',
        },
        type: Sequelize.INTEGER,
      },
    });
  },
  down: async (queryInterface, Sequelize) => {
    await queryInterface.dropTable('ScholarshipAccounts');
  },
};

지금 가장 마지막에 student_ID라고 하는 컬럼을 추가한 것이 보이는가?

student_ID: { //
        references: {
          model: 'Students',
          key: 'id',
        },
        type: Sequelize.INTEGER,
      },

지금 이것은 Students 테이블의 id 컬럼을 참조는 foreign key를 생성하라는 뜻이다.

2. ()-create-course.js

'use strict';
module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable('Courses', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER,
      },
      courseCode: {
        type: Sequelize.STRING,
      },
      title: {
        type: Sequelize.STRING,
      },
      description: {
        type: Sequelize.STRING,
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE,
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE,
      },
      professor_ID: { // 
        references: {
          model: 'Professors',
          key: 'id',
        },
        type: Sequelize.INTEGER,
      },
    });
  },
  down: async (queryInterface, Sequelize) => {
    await queryInterface.dropTable('Courses');
  },
};

여기서도 마찬가지로 professor_ID라는 foreign key를 추가했다.

3. ()-create-grade.js

'use strict';
module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable('Grades', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER,
      },
      score: {
        type: Sequelize.INTEGER,
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE,
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE,
      },
      student_ID: { //
        references: {
          model: 'Students',
          key: 'id',
        },
        type: Sequelize.INTEGER,
      },
      student_ID: { //
        references: {
          model: 'Courses',
          key: 'id',
        },
        type: Sequelize.INTEGER,
      },
    });
  },
  down: async (queryInterface, Sequelize) => {
    await queryInterface.dropTable('Grades');
  },
};

Grades 테이블에는 foreign key가 총 2개 필요하기 때문에 이렇게 두 개를 추가했다.

자, 이렇게 파일들을 저장하고

npx sequelize db:migrate

을 실행하자. 그런데 이대로 실행하면

에러가 발생한다. Courses 테이블을 만들다가 Professors 테이블을 열지 못했다는 문구가 출력된다. 지금 Professors 테이블이 없는 상태에서 Courses 테이블에 Professors 테이블의 id 컬럼을 참조하는 prfoessor_ID 컬럼을 만들려고 해서 그런 것이다. 이런 경우에는 어떻게 해야할까? 이런 경우에는 Professors 테이블이 Courses 테이블보다 먼저 존재하도록 (timestamp)-create-professor.js 파일의 timestamp 값을 수정해주면 된다. 값을 더 앞으로 오도록 수정해주고

다시

npx sequelize db:migrate

을 실행하면 다시 나머지 migration 파일들이 잘 실행된다. 각 foreign key들이 잘 생성 및 설정되었는지 확인해보면

각 foreign key들이 잘 생성된다는 것을 알 수 있다.

이렇게 외래키 설정도 migration 파일에 포함시켜서 명령어로 할 수 있다는 사실을 기억하자.

!!! 공식 문서대로 하니까 안 되는 부분이 있다.

student_ID: { //
        references: {
          model: 'Students',
          key: 'id',
        },
        type: Sequelize.INTEGER,
      },

공식 문서에서는 저 model 부분에

model 이름(단수형)을 적어도 되고, table 이름(복수형)을 적어도 둘 다 되는 것처럼 적혀있는데 실제로 해보니까 table 이름(복수형)을 적어야 정상적으로 동작한다.. 이름이 model인데 이건 뭔가 좀 이상하다..

profile
성장의 기쁨

0개의 댓글