inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지

LightSail 사용하기

Sequelize 질문

344

옥윤성

작성한 질문수 9

0

안녕하세요

One-to-Many 관계

ondelete : "cascade" 관련 질문이 있습니다

 

게시판을 만들어서, 댓글 테이블과 대댓글 테이블을 One-to-Many관계로 해서, 댓글을 지우면 해당 댓글에 달린 대댓글도 같이 삭제가 되도록

ondelete : "cascade" 설정을 했습니다.

 

models/commnet(댓글).js

const Sequelize = require("sequelize");

module.exports = class Comment extends Sequelize.Model {
  static init(sequelize) {
    return super.init(
      {
        reply: {
          type: Sequelize.TEXT,
          allowNull: false,
        },
        nick: {
          type: Sequelize.STRING(50),
          allowNull: false,
        },
      },
      {
        sequelize,
        timestamps: true,
        underscored: false,
        modelName: "Comment",
        tableName: "comments",
        paranoid: true,
        charset: "utf8",
        collate: "utf8_general_ci",
      }
    );
  }

  static associate(db) {
    db.Comment.belongsTo(db.Post);
    db.Comment.belongsTo(db.User);
    db.Comment.hasMany(db.Recomment, { onDelete: "CASCADE", hooks: true });
  }
};

 

models/recomment(대댓글).js

const Sequelize = require("sequelize");

module.exports = class Recomment extends Sequelize.Model {
  static init(sequelize) {
    return super.init(
      {
        re_reply: {
          type: Sequelize.TEXT,
          allowNull: false,
        },
        nick: {
          type: Sequelize.STRING(50),
          allowNull: false,
        },
        UserId: {
          type: Sequelize.INTEGER(40),
          allowNull: false,
        },
      },
      {
        sequelize,
        timestamps: true,
        underscored: false,
        modelName: "Recomment",
        tableName: "recomments",
        paranoid: true,
        charset: "utf8",
        collate: "utf8_general_ci",
      }
    );
  }

  static associate(db) {
    db.Recomment.belongsTo(db.Comment);
    db.Recomment.belongsTo(db.Post);
  }
};

 

Sequelize 공식 문서에 따라( https://sequelize.org/docs/v6/other-topics/hooks/#one-to-one-and-one-to-many-associations )

 db.Comment.hasMany(db.Recomment, { onDelete: "CASCADE", hooks: true });
db.Recomment.belongsTo(db.Comment);

다음과 같이 작성했습니다. (안 되어서 양쪽에 {onDelete: "CASCADE", hooks : true} 를 다 넣어보기도 했지만 역시나 안 되었습니다.)

DB는 MySQL을 사용하고 있습니다.

 

위와 같이 한 후, npm start 를 하여서 MySQL에서 comment테이블과 recomment테이블이 생성되었는데, association에 의해 생긴 CommentId 속성이 onDelete set null 로 되어 있어서, migration을 진행했습니다.

처음에는 changeColumn 을 실행했는데, CommentId 기존의 것은 그대로 있고, onDelete cascade가 적용된 CommnetId가 하나 더 생기는 이상한 일이 발생해서, removeColumn 을 migration으로 진행한 후, 아래와 같이 addColumn을 진행해서, MySQL에서는 원하는 설정으로 나왔습니다.

"use strict";

/** @type {import('sequelize-cli').Migration} */
module.exports = {
  async up(queryInterface, Sequelize) {
    return queryInterface.addColumn("Recomments", "CommentId", {
      type: Sequelize.INTEGER(40),
      references: {
        model: "comments",
        key: "id",
      },
      onDelete: "CASCADE",
      onUpdate: "CASCADE",
    });
  },

  async down(queryInterface, Sequelize) {
    return queryInterface.removeColumn("Recomments", "CommentId");
  },
};

 

그런데

param.id로 CommentId를 받아와서 해당 id의 데이터를 comment테이블에서 삭제하도록 했을 때,

    const CommentId = parseInt(req.params.id, 10);
    await Comment.destroy({ where: { id: CommentId } });

comment테이블에서 삭제가 되었으나, recomment 테이블에서는 삭제가 되지 않습니다..ㅠ 어떻게 해야 할까요?

 

mongodb nodejs mysql Sequelize

답변 1

0

제로초(조현영)

대댓글 하나를 더 추가한 다음에 다시 시도해보세요. 저 SQL이 적용된 게 맞다면 지워져야 합니다.

0

옥윤성

여전히 안 되네요 ㅠㅠ

0

제로초(조현영)

https://stackoverflow.com/a/24245509

혹시 이 설정이 꺼져있나요?

리눅스 노드 설치시 패키지

0

165

0

socket.js 에서 referer로부터 roomId를 가져올 때

0

909

3

스트리밍 방식으로 대용량 파일 업로드 & 다운로드 관련 질문

0

2286

2

a[title] 질문드립니다

0

380

1

리뉴얼 강의 및 공부 방법

0

583

1

jwt decode

0

1135

1

node.js 교과서 3판 질문드립니다

0

393

1

passport와 jwt

0

437

1

리뉴얼 강의

0

422

2

혹시 Node.js 교과서 3판 이북은 언제 나오나요?

0

356

1

몽고디비 사용자도 MYSQL부분을 들어야 하나요???

0

485

1

sql 쿼리 로그는 어떤 모듈이 작성하나요?

0

507

2

nunjucks res.render('error'); 작동을 안합니다.

0

514

1

질문있습니다.

0

348

1

multer 한글 파일 업로드시 파일명이 깨져요.

1

3538

1

수업자료는 어디있나요?

0

369

1

질문 있습니디

0

240

1

multer 사용시 file 외 name값은 못받나용?

0

421

1

코드 중복 부분 질문드립니다.

0

300

1

api 만드는 이유 질문드립니다.

0

290

1

Strategy의 done에 대해 질문드립니다.

0

368

1

안녕하세요 fs 권한 관련 질문드립니다

0

453

1

시퀄라이즈 연결질문...

0

503

2

res.setHeader vs res.cookie

0

1791

3