sequelize-cli로 foreign key를 설정하는 것도 가능하다. 잠깐 migrations 디렉토리 안을 보자.
이 각각의 파일 중에서 foreign key 설정을 해줘야 하는 것들을 아래와 같이 수정하면 된다.
'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를 생성하라는 뜻이다.
'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를 추가했다.
'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인데 이건 뭔가 좀 이상하다..