TIL-211222

5820 ワード

SQL query
  • データベースクエリは非同期要求
  • です.
  • コントローラは、入力データオブジェクトを二重配列として作成し、バッチ
  • をテーブルに挿入する.
    // 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 = []; 変数が少ない場合は、
  • を直接入れることができます.