sequelize에서 FK 없이 JOIN하기
왜 FK 없이 JOIN을 하는 상황이 발생할까?
- 업무를 하면서 FK와 PK의 제약조건 때문에 관계를 가진 FK를 지워야 하는 상황이 있었다.
Cannot add or update a child row: a foreign key constraint fails (`tms_test`.`orderMaster`, CONSTRAINT `fkorderMasterdepartment` FOREIGN KEY (`dispatchTeam`) REFERENCES `department` (`code`) ON DELETE NO ACTION ON UPDATE NO ACTION)
- 이러한 에러가 생겼는데, 해석하자면 FK에 해당되는 row에 INSERT 또는 UPDATE를 할 수 없다고 한다.
- 여기에서 PK는
orderMaster
의 dispatchTeam
에 해당이 되고 FK는 department
테이블의 code
가 된다.
dispatchTeam
은 nullable이 true지만, code
는 false이기 때문에 dispatchTeam
에서 null을 넣게 되면 허용이 되지 않아 이렇게 오류가 뜨게 되는 것이다.
- 이를 해결하기 위해
department
의 PK를 바꾸고, code
를 nullable을 true로 하였으나, 똑같은 오류가 떴다.
- 때문에
sequelize
에서 '일시적으로' hasMany
관계를 지어서 JOIN하려고 한다.
Example
orderMaster.belongsTo(department, { as: "dispatchTeam_department", foreignKey: "dispatchTeam"});
department.hasMany(orderMaster, { as: "orderMasters", foreignKey: "dispatchTeam"});
- 이를
initModels
에 거는 것이 아닌 controller
에 걸어주도록 한다.
- 함수 안에다 넣으면 stack에 들어가 전역적으로 적용이 되지 않는다.
- 이는 ORM에 직접적으로 적용되는 게 아닌 controller에서 함수가 실행될 때 적용되고 바로 초기화 된다.
const list = await orderMaster.findAll({
include: [
{ model: model, as: "model" },
{ model: model, as: "model" },
{ model: model, as: "model" },
{ model: model, as: "model" },
{ model: model, as: "model" },
{
model: department,
as: "dispatchTeam_department",
},
- 그러면 이렇게
include
를 해도 오류가 나지 않는다.