저장을 습관화
230710 TIL 본문
- sequelize로 MySQL 다룰때
데이터 생성한다고 반드시 router.post 써야하는거 아니고
삭제한다고 반드시 router.delete 써야하는것도 아니고
수정한다고 반드시 router.put 써야하는것도 아니다
router.put 안에서도 Table.create, Table.destory 잘만 작동하더라..
- sequelize .increment(), .decrement()
MySQL 기준
테이블에 데이터 타입이 integer 등 숫자로 지정된 데이터의 값을 증가하거나 감소시킬때 쓰는 메소드
더하기 빼기
※ 적용하기 전에
적용하려는 데이터의 컬럼의 기본값이 null이면 값의 증감이 안됨
자바스크립트에서는 null + 1은 1이고, 결과의 데이터 타입도 number가 되지만
MySQL에서는 아님
null + 정수는 그대로 null 임
때문에 반드시 아래와 같이 기본값을 지정해주어야함
for 반복문에서 i 기본값 지정해주는 것 같네
exTable.init(
{
...(중략)...
exColumn: {
type: DataTypes.INTEGER,
defaultValue: 0,
},
...(중략)...
},
{
sequelize,
modelName: "exTable",
}
);
증가
방법 1. exTable.increment("컬럼", { by: 값 })
방법 2. exTable.increment({ 컬럼 : 값 })
감소
방법 1. exTable.decrement("컬럼", { by: 값 })
방법 2. exTable.decrement({ 컬럼 : 값 })
사용 예시
// 좋아요 테이블: Likes
// 좋아요 테이블의 컬럼: likesId(PK), PostId(FK), UserId(FK)
// 게시글 좋아요 API
router.put("/posts/:postId/like", authMiddleware, async (req, res) => {
const { postId } = req.params;
const { userId } = res.locals.user;
if (!userId) {
return res.status(403).json({ errorMessage: "로그인 후 사용 가능합니다." });
}
console.log("현재 접속한 사용자의 ID", userId);
const post = await Posts.findOne({
where: { postId: postId },
attribute: ["liked"],
});
if (!post) {
return res.status(404).json({ message: "게시글을 찾을 수 없습니다." });
}
console.log(post);
console.log("현재 게시글의 좋아요 수", post.dataValues.liked);
try {
// 좋아요, 좋아요 취소 로직
const didILike = await Likes.findOne({
where: { [Op.and]: [{ PostId: postId }, { UserId: userId }] },
});
// console.log("좋아요했던가?", didILike);
if (!didILike) {
// 없다면 좋아요 등록
await Likes.create({ PostId: postId, UserId: userId });
// 1번 방법
// await Posts.increment("liked", { where: { postId: postId } }, { by: 1 });
// 2번 방법
// await Posts.increment(
// {
// liked: 1,
// },
// { where: { postId: postId } }
// );
return res.status(200).json({ LIKE: "해당 게시글에 좋아요 했습니다." });
} else if (didILike) {
// 있다면 좋아요 취소
await Likes.destroy({
where: { [Op.and]: [{ PostId: postId }, { UserId: userId }] },
});
// 1번 방법
await Posts.decrement("liked", { where: { postId: postId } }, { by: 1 });
// 2번 방법
// await Posts.decrement(
// {
// liked: 1,
// },
// { where: { postId: postId } }
// );
return res
.status(200)
.json({ CANCEL: "해당 게시글의 좋아요를 취소했습니다." });
}
// 기능 작동은 하는데 이런 식으로 하면 likeId가 끝도없이 계속 늘어난다..
// 당장은 괜찮겠지만 12351235125 이 정도로 늘어나면 문제 생길텐데
} catch (error) {
return res
.status(400)
.json({ errorMessage: "좋아요 작업에 실패했습니다." });
}
});
[참조]
https://velog.io/@cadenzah/sequelize-document-3
Sequelize 공식 Document - (3) Instances
해석과 설명을 곁들인 Sequelize 도큐먼트 정복, 그 3편
velog.io
https://includecoding.tistory.com/217
node.js sequelize 값 증가 update 하는 방법 ( sequelize 더하기 )
아.. 정말 이것때문에 애 먹었던 것 같다. 현재 만드는 포트폴리오 중 동영상 스트리밍 홈페이지 '나튜브'를 만들고 있는데 영상을 클릭할 때마다 조회수를 증가시킬 수 있도록 하려고 하는데 upd
includecoding.tistory.com
'공부 > TIL' 카테고리의 다른 글
230801 TIL - TypeScript 강의 요약 및 추가 학습 자료 (0) | 2023.08.02 |
---|---|
230725 TIL - 데이터 타입 enum, babel (0) | 2023.07.26 |
230706 TIL (0) | 2023.07.06 |
230704 TIL (0) | 2023.07.04 |
230629 TIL (0) | 2023.06.29 |