과거 프로그래밍 자료들/프로젝트

sql 오류 및 sequelize 정리

평부 2022. 9. 1. 14:07

 

1)  문제 : WHERE parameter "id" has invalid "undefined" value 

-> patch 사용 중 id값이 계속 전달되지 않음

 

참고한 내용

https://stackoverflow.com/questions/68560280/error-where-parameter-id-has-invalid-undefined-value-reactjs

 

Error: WHERE parameter "id" has invalid "undefined" value, reactjs

I am working on a project where the post has many comments, and I am trying to take the amount of the comments and display them in the UI. but I am getting error Error: WHERE parameter "id&quo...

stackoverflow.com

//수정 전
router.patch("/:deleteId", function (req, res, next) {
  const deleteId = req.params.id;
  
//수정 후
router.patch("/:deleteId", function (req, res, next) {
  const deleteId = req.params.deleteId;
  
//수정 후(다른 버전)
router.patch("/:id", function (req, res, next) {
  const deleteId = req.params.id;

 

2)  sql내 모든 값들을 업데이트 하고 싶어함

 

오류 원인

  code: 'ER_TRUNCATED_WRONG_VALUE',
    errno: 1292,
    sqlState: '22007',
    sqlMessage: "Truncated incorrect INTEGER value: 'allStatus'",
    sql: 'UPDATE `words` SET `status`=?,`updatedAt`=? WHERE (`deletedAt` IS NULL AND `id` = ?)',
    parameters: [ 'C', '2022-09-01 04:24:24', 'allStatus' ]

 

-> axios로 넘기는 주소를 "/word/allStatus"로 하니 오류 발생

-> allStatus가 문제라기 보단, `id`=? 내 id값 즉 숫자가 들어가지 않아 생긴 오류

 

-> /status/1로 변경

 

//오류 코드
router.patch("/allStatus", function (req, res, next) {
  try {
    // const wordId = req.params.wordId;

    Word.update(
      {
        status: req.body.status,
      },
      {
        where: {
          id: {
            [Op.gt]: 0,
          },
        },
      }
    );
    console.log("req.body", req.body);
    console.log("req.body.status", req.body.status);
    res.send("update done");
    // res.redirect("/index");
  } catch (err) {
    console.error(err);
    next(err);
  }
})

//변경된 코드
router.patch("/status/1", function (req, res, next) {
  try {
    // const wordId = req.params.wordId;

    Word.update(
      {
        status: req.body.status,
      },
      {
        where: {
          id: {
            [Op.gt]: 0,
          },
        },
      }
    );
    console.log("req.body", req.body);
    console.log("req.body.status", req.body.status);
    res.send("update done");
    // res.redirect("/index");
  } catch (err) {
    console.error(err);
    next(err);
  }

 

 

SQL문과 sequelize 문 비교

 

 

- SELECT

//SQL
select english, korean, type, status from engWord_sns.words 
where (status = "A" or status = "C") and type = "easy" order by createdAt DESC;

//sequelize
//model은 Word

Word.findAll({
      include: {
        model: User,
        attributes: ["id"],
      },
      attributes: ["id", "english", "korean", "status"],
      where: {
        [Op.or]: [{ status: "A" }, { status: "C" }],
        type: "easy",
      },
      order: [["createdAt", "DESC"]],
    });

 

 

- CREATE

 

//SQL
insert into engWord_sns.words 
(english, korean, type, status) values ("test", "테스트", "easy", "A");

//sequelize
//model은 Word
 Word.create({
      // 단어 등록
      UserId: req.user.id,
      english,
      korean,
      type,
      status: "A",
    });

 

 

- UPDATE

* 두 번째 update의 경우

'2)  sql내 모든 값들을 업데이트 하고 싶어함' 참고

 

//1개만 수정
//SQL
update engWord_sns.words set english = "water", korean = "물" where id = 12;

//sequelize
//model은 Word
Word.update(
    {
    //프론트에서 input id="english"에서 값을 전달 받을 경우 req.body.english
    //프론트에서 input id="korean"에서 값을 전달 받을 경우 req.body.korean
      english: "water",
      korean: "물"
    },
    {
      where: { id: 12 }, //word의 id, 프론트에서 전달받을 경우 id는 req.params.id로 지정
    }
  )
  
 //전체 수정
 //SQL
 update engWord_sns.words set status = "A" where id >= 0;
 
 //
Word.update(
   {
     status: "A"
   },
    {
     where: {
      id: {
       [Op.gt]: 0, //0보다 큰 경우 적용 
       //이 경우 router.patch("/status/1", function (req, res, next) 
       //{ try{Word.update(...)}catch{}}로 적용해야 함 
      },
    },
   }
 );

 

 

- COUNT

 

//개수세기
//SQL
select count(*) from engWord_sns.words where UserId = 1;

//sequelize
//model은 Word
 Word.count({
      where: {
        UserId: 1,
      },
    });

 

* 시퀄라이즈 자세한 문법 설명

https://inpa.tistory.com/entry/ORM-%F0%9F%93%9A-%EC%8B%9C%ED%80%84%EB%9D%BC%EC%9D%B4%EC%A6%88-%EC%BF%BC%EB%A6%AC-%EB%AC%B8%EB%B2%95

 

[ORM] 📚 시퀄라이즈 - 쿼리 문법 정리

시퀄라이즈 쿼리문 CRUD 작업을 하기 위해선 먼저 시퀄라이즈 쿼리를 알아야한다. SQL문을 자바스크립트로 생성하는 것이기 때문에, 시퀄라이즈의 방식을 사용해야 한다. 시퀄리아지 쿼리문을 비

inpa.tistory.com

https://sebhastian.com/sequelize-count/

 

Sequelize - how to COUNT table rows number with code example

Learn how to count with Sequelize. Practical code example included.

sebhastian.com