모델1과 모델2가 1:N의 관계를 가진다면?
hasMany / belongsTo
const {
Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
class 모델1 extends Model {
static associate(models) {
// define association here
models.모델1.hasMany(models.모델2);
}
};
'use strict';
const {
Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
class 모델2 extends Model {
static associate(models){
//define association here
models.모델2.belongsTo(models.모델1);
};
}
const { 모델1, 모델2 } = sequelize.models ;
//여기서 models는 모델들이 모여있는 폴더를 말함 . 구조분해
모델2.belongsTo(모델1);
모델1.hasMany(모델2);
1:N
에서 1에 해당하는 모델에hasMany
를 붙여준다.
모델과 해당 스키마(마이그레이션 폴더에 있음)가 일치하는지 확인
대부분 일치함.
빈 스켈레톤 파일을 생성
npx sequelize-cli migration:generate --name migration-skeleton
예시)
npx sequelize-cli migration:generate --name add-column-postId
"migration-skeleton"부분에 이름을 만들어주면 되는데,
일반적으로 새롭게 생성할 컬럼명을 써주는것 같다. ex) postId
해당 마이그레이션 스켈레톤 파일에서 컬럼추가 및 FK를 설정한다.
module.exports = {
up: (queryInterface, Sequelize) => {
// logic for transforming into the new state
//여기서 이전에 관계를 설정해준 모델 관련 fk설정을 진행
//1.칼럼추가
//2. fk설정
},
down: (queryInterface, Sequelize) => {
// logic for reverting the changes
// migration undo를 했을때, 일어나는 일들 진행
//1. fk설정 삭제
//2. 컬럼삭제
}
}
addColumn
/addConstraint
removeConstraint
/removeColumn
'use strict';
module.exports = {
up: async (queryInterface, Sequelize) => {
// field 추가
await queryInterface.addColumn('모델2테이블명', '새로생성할컬럼', Sequelize.INTEGER);
// foreign key 연결
await queryInterface.addConstraint('모델2테이블명', {
fields: ['새로생성할컬럼명'],
type: 'foreign key',//fk설정
name: 'FK_any_name_you_want',
references: {
table: '모델1테이블명',
field: 'id'
}, //모델1테이블의 id값을 참조하겠다. (모델1이 1:N중 1)
onDelete: 'cascade',
onUpdate: 'cascade'
});
},
down: async (queryInterface, Sequelize) => {
await queryInterface.removeConstraint('모델2테이블명', 'FK_any_name_you_want');
await queryInterface.removeColumn('모델2테이블명', '새로생성한컬럼명');
}
};