반응형
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,
});
그리고 저는 마이그레이션으로 데이터베이스를 생성해왔는데
모델로 기준으로 하여 데이터 베이스를 생성한다면 마이그레이션에 설정 값을 모델로 넣으면 됩니다.
구글 검색에 해결법이 너무 다양하게 나와있어서 전부 해보았지만 제대로 된 것이 없어 답답했지만
결국 이것저것 다 섞어보며 노가다를 했더니 이런 해결방법을 찾아 다행입니다.
728x90
반응형
'JavaScript & TypeScript' 카테고리의 다른 글
[node.js] TDD / Jest(관련링크) (0) | 2022.03.05 |
---|---|
[Node.js] TDD를 위한 Dependency Injection (0) | 2022.02.21 |
[JS] CommonJS와 ES6 (0) | 2022.02.13 |
[JS] 반복문에 promise (0) | 2022.02.07 |
[Node.js] express-validator (유효성 검사) (0) | 2022.01.14 |