`.execute()` 로 sql 실행
SQL 데이터 삭제 DELETE, TRUNCATE, DROP
`DELETE FROM 테이블명 (WHERE 조건);` : 조건에 따라 행이 삭제 > 테이블 유지 (없으면 전체삭제)
`DROP TABLE 테이블명;` : 테이블 통째로 삭제
`TRUNCATE 테이블명;` : 모든 행 삭제하고 > 테이블 유지
DELETE, TRUNCATE 차이점 : Auto Increment 초기화 해준다!
SET foreign_key_checks=0;
TRUNCATE cartItems;
SET foreign_key_checks=1;
<행 삭제 없이 Auto Increment 초기화하는 방법>
SET @count=0;
UPDATE orderedBook SET id=@count:=@count+1;
ALTER TABLE orderedBook AUTO_INCREMENT=5;
fk로 연결되어있을경우 orderedBook > delivery > orders
> 참조하고 있는 테이블 먼저 지우고, 참조된 테이블을 지운다 > 데이터가 없어도, 그래도 제약조건이 걸려 있어서 문제 발생!!
> `SET FOREIGN_KEY_CHECKS = 0` 지금은 FK 제약조건을 사용하지 말자! 사용후 다시 `1로 설정`
cartItemId
장바구니 구매 후 주문완료된 아이템 삭제
프론트에서 이미 가지고 있을, 전달되는 데이터 id
DELETE FROM cartItems WHERE id IN(1,2,3);
const deleceCartItems = async (req, res) => {
let sql = `DELETE FROM cartItems WHERE id IN (1,2,3);`;
let values = [1, 2, 3];
let result = await conn.execute(sql, values);
return result;
};
req body 값의 item 배열의 구조를 변환해주기
장바구니 도서 id를 받아서 전달하면, select해서 book_id랑 quantity만 뽑아내서 insert 하는 방법
//items 를 가지고, 장바구니에서 book_id, quantity 조회
sql = "SELECT book_id, quantity FROM cartItems WHERE IN (?)";
let orderItems = await conn.query(sql, [items]);
///...
const deleceCartItems = async (conn, items) => {
let sql = `DELETE FROM cartItems WHERE id IN (?);`;
let result = await conn.query(sql, [items]);
return result;
};
{
"items" : [1,2,3],
"delivery" : {
"address" : "서울시 북구",
"receiver" : "다희",
"contact" : "010-1111-1111"
},
"firstBookTitle" : "어린왕자들",
"totalQuantity":3,
"totalPrice" : 60000,
"userId" : 1
}
items에서 id를 가지고만 book_id, quantity를 조회해서 insert에서 사용한다.
//delivery 테이블 삽입
let sql =
"INSERT INTO delivery (address, receiver, contact) VALUES (?, ?, ?);";
let values = [delivery.address, delivery.receiver, delivery.contact];
let [result] = await conn.execute(sql, values);
let delivery_id = result.insertId;
//orders 테이블 삽입
sql = `INSERT INTO orders (book_title, total_quantity, total_price, user_id, delivery_id)
VALUES (?, ?, ?, ?, ?)`;
values = [firstBookTitle, totalQuantity, totalPrice, userId, delivery_id];
[result] = await conn.execute(sql, values);
let order_id = result.insertId;
//items 를 가지고, 장바구니에서 book_id, quantity 조회
sql = "SELECT book_id, quantity FROM cartItems WHERE id IN (?)";
let [orderItems, fields] = await conn.query(sql, [items]);
//orderedBook 테이블 삽입
sql = `INSERT INTO orderedBook (order_id, book_id, quantity) VALUES ?;`;
//items 배열 요소를 하나씩 꺼내서 forEach > 이차원 배열로 값 던지기
values = [];
orderItems.forEach((item) => {
values.push([order_id, item.book_id, item.quantity]);
});
result = await conn.query(sql, [values]);
result = await deleceCartItems(conn, items);
return res.status(StatusCodes.OK).json(result);
};
const deleceCartItems = async (conn, items) => {
let sql = `DELETE FROM cartItems WHERE id IN (?);`;
let values = [1, 2, 3];
let result = await conn.query(sql, [items]);
return result;
};
주문 목록 조회 GET
[
{
id : 주문 id,
created_at : “주문일자”,
address : “주소”,
receiver : “이름”,
contact : “전화번호”,
book_title : “대표 책 제목”,
total_quantity : 총 수령,
total_price : 결제 금액
}
]
orders 테이블의 select해서 보낸다.> + delivery JOIN
const getOrders = async (req, res) => {
const conn = await mariadb.createConnection({
host: "localhost",
user: "root",
password: "root",
database: "Bookshop",
dateStrings: true,
});
let sql = `SELECT orders.id, book_title, total_quantity, total_price, created_at, address, receiver, contact
FROM orders LEFT JOIN delivery
ON orders.delivery_id = delivery.id;`;
let [rows, fields] = await conn.query(sql);
return res.status(StatusCodes.OK).json(rows);
};
주문 상세 상품 조회 GET
orderedBook 테이블에서 where절로 ook_id, quantity를 도출하고, book_id로 JOIN으로 책 정보 가져온다.
[
{
book_id : 도서 id,
title : “도서 제목”,
author : “작가명”,
price : 결제 금액,
quantity: 총 수령
},{
bookId : 도서 id,
bookTitle : “도서 제목”,
author : “작가명”,
price : 결제 금액,
quantity: 총 수령
},
…
]
const getOrderDetail = async (req, res) => {
const { id } = req.params;
const conn = await mariadb.createConnection({
host: "localhost",
user: "root",
password: "root",
database: "Bookshop",
dateStrings: true,
});
let sql = `SELECT book_id, title, author, quantity, price
FROM orderedBook LEFT JOIN books
ON orderedBook.book_id = books.id
WHERE order_id=?`;
let [rows, fields] = await conn.query(sql, [id]);
return res.status(StatusCodes.OK).json(rows);
};
☑️ 배운 점
장바구니 insert, delete를 진행하면서 데이터 형식이나 async 범위, 등등 에러가 잠 많이 발생한 것 같다.
그래서 부분은 강의를 좀 정신없이 따라가기 바빴다. 특히 id 값에 AI를 설정하니 숫자가 에러가 발생해도 증가하니... 지웠다가, 삽입했다가, 로직 생각했다가... 어려웠던 것 같다.
async - await 관련해서 공식문서의 예시와 글을 조금 더 찾아보아야 겠다.