sequelize에서 FK 없이 JOIN하기

어쩌다·2022년 7월 7일
0

sequelize에서 FK 없이 JOIN하기


왜 FK 없이 JOIN을 하는 상황이 발생할까?

  1. 업무를 하면서 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)
  1. 이러한 에러가 생겼는데, 해석하자면 FK에 해당되는 row에 INSERT 또는 UPDATE를 할 수 없다고 한다.
  2. 여기에서 PK는 orderMasterdispatchTeam에 해당이 되고 FK는 department 테이블의 code가 된다.
  3. dispatchTeam은 nullable이 true지만, code는 false이기 때문에 dispatchTeam에서 null을 넣게 되면 허용이 되지 않아 이렇게 오류가 뜨게 되는 것이다.
  4. 이를 해결하기 위해 department의 PK를 바꾸고, code를 nullable을 true로 하였으나, 똑같은 오류가 떴다.
  5. 때문에 sequelize에서 '일시적으로' hasMany 관계를 지어서 JOIN하려고 한다.

Example

orderMaster.belongsTo(department, { as: "dispatchTeam_department", foreignKey: "dispatchTeam"});
department.hasMany(orderMaster, { as: "orderMasters", foreignKey: "dispatchTeam"});
  1. 이를 initModels에 거는 것이 아닌 controller에 걸어주도록 한다.
  2. 함수 안에다 넣으면 stack에 들어가 전역적으로 적용이 되지 않는다.
  3. 이는 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",
          },
  1. 그러면 이렇게 include를 해도 오류가 나지 않는다.
profile
혼자 공부하는 공간

0개의 댓글