TIL-211222

EBinY·2021년 12월 22일
0

TIL - Today I Learned

목록 보기
25/54

SQL query

  • Database 쿼리는 비동기 요청임
  • controller에서 전달받은 데이터 객체를 이중배열 형태로 만들어 table에 bulk insert
// post에 대한 models에서의 처리
post: (userId, orders, totalPrice, callback) => {
  // 각 변수에 대응하는 쿼리문을 작성, 총 4개의 변수
  // query절을 변수에 미리 짜 두고, ?을 넣어 변수로 사용함
  const str1 = `INSERT INTO orders (user_id, total_price) VALUES (?, ?)`;
  // params를 저장하여 사용할 수 있음, 혹은 params 자리에 [userId, totalPrice]를 직접 넣어도 가능
  let params = [userId, totalPrice];
  db.query(str1, params, (error, result) => {
    // result의 값의 유무에 따라 분기 시킴
    // 두 테이블에서의 데이터를 불러오기 위해, 이중 쿼리문으로 작성하였음
    // 단, 콜백은 1회만 가능하므로(요청1에 응답1) 콜백은 맨 아래에 한번만 작성한다
    if (result) {
      const str2 = `INSERT INTO order_items (order_id, item_id, order_quantity) VALUES ?`
      // 변수를 적절하게 받아오기 위해, map함수를 통하여 데이터를 받아온다
      const params = orders.map((order) => {
        // result.insertId의 경우 orders에 쿼리를 통하여 생성된 id가 오게 된다, 또한 이를 orders와 order_items 두 테이블의 연결을 위해 order_id에 넣어준다
        return [result.insertId, order.itemId, order.quantity]
      });
      return db.query(str2, [params], (error, result) => {
        if (error) callback(error, null)
        else callback(null, result)
      })
    } else {
      callback(error, null)
    }
  })
}
  • values (?, ?) or value ? : ?의 위치에 들어갈 내용을 변수 처리하여 줌
    • params = []; 로 처리해서 넣어줘도 되고, 변수가 적은 경우에는 직접 넣어도 됨

0개의 댓글