[Node.js] Sequelize ondelete
JavaScript & TypeScript

[Node.js] Sequelize ondelete

반응형

 

 

ondelete 속성은 데이터를 삭제하는데 있어서 관련된 데이터를 삭제하는데 용이합니다.

1:N의 관계의 테이블에서 1의 데이터를 지우면 관련된 N을 지우게 됩니다.

 

예를들어 한 유저가 여러 게시물을 썼는데 그 유저가 회원 탈퇴를 하게 되면 그 유저가 쓴 게시물이 모두 사라지는 방식입니다.

 

ondelete에 대해 쓰는 이유는 수없이 찾아보고 stackoverflow를 찾아 봤지만 동작이 되지 않았는데 결국 해결 방법을 찾았습니다.

 

아래는 user : photo = 1 : N 관계로 설정한 내용 입니다.

1(hasMany) : N(belogsTo)

 

Model

model - user.js (1)

    static associate(models) {
      user.hasMany(models.photo, {
        foreignKey: "userId",
      });
    }

 

model - photo.js (N)

    static associate(models) {
      photo.belongsTo(models.user, {
        foreignKey: "userId",
        onDelete: "CASCADE",
      });
    }

 

Migrations

migrations - user.js (1)

      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER,
      },

 

migrations - photo.js (N)

      userId: {
        type: Sequelize.INTEGER,
        references: {
          model: "user",
          key: "id",
        },
        onDelete: "CASCADE",
      },

 

오버스텍플로우에서의 답변을 종합해보자면

  • CASCADE를 대문자
  • Type은 INTEGER을 사용
  • onDelete 속성은 1:N 관계에서 N인 쪽에만 설정을 해주면 된다.
  • model에서는 associate 관계를 정립해주어야 하고
  • migrations에서는 N인 쪽에서 references를 설정해주어야 한다.

아래 코드에서 ondelete와 함께 hooks: true 을 넣어라는 글도 많았지만 딱히 영향을 주지는 않았습니다.

(공식문서에 활용하는 내용이 있긴 했다)

      user_weather.belongsTo(models.weather, {
        foreignKey: "weatherId",
        onDelete: "CASCADE",
        hooks: true,
      });

 

그리고 저는 마이그레이션으로 데이터베이스를 생성해왔는데

모델로 기준으로 하여 데이터 베이스를 생성한다면 마이그레이션에 설정 값을 모델로 넣으면 됩니다.

 

구글 검색에 해결법이 너무 다양하게 나와있어서 전부 해보았지만 제대로 된 것이 없어 답답했지만

결국 이것저것 다 섞어보며 노가다를 했더니 이런 해결방법을 찾아 다행입니다.

 

 

 

반응형