고양이와 코딩
[웹 풀사이클 데브코스 TIL] 9주차 Day 4 - conn.query, MySQL 데이터 삭제 본문
promise 모듈은 async/await 및 Promise를 기반으로 하여 비동기적 작업을 처리할 수 있도록 설계되었습니다!
따라서 이제는 콜백 함수를 실행하지 않고 비동기적으로 쿼리를 실행 할 수 있습니다
// const conn = require('../mariadb') // db 모듈
const mariadb = require('mysql2/promise');
const {StatusCodes} = require('http-status-codes'); // status code 모듈
const order = async(req, res) => {
const conn = await mariadb.createConnection({
host : 'localhost',
user : 'root',
password : 'root',
database : 'Bookshop',
dataStrings : true
})
const {items, delivery, totalQuantity, totalPrice, userId, firstBookTitle} = req.body;
// delivery 테이블 삽입
let sql = `INSERT INTO delivery (address, receiver, contact) VALUES (?, ?, ?)`;
let values = [delivery.address, delivery.receiver, delivery.contact];
let [results] = await conn.execute(sql, values);
let delivery_id = results.insertId;
console.log(results);
// orders 테이블 삽입
sql = `INSERT INTO orders (book_title, total_quantity, total_price, user_id, delivery_id)
VALUES (?, ?, ?, ?, ?)`;
values = [firstBookTitle, totalQuantity, totalPrice, userId, delivery_id];
[results] = await conn.execute(sql, values);
let order_id = results.insertId;
// orderedBook 테이블에 데이터 삽입
sql = `INSERT INTO orderedBook (order_id, book_id, quantity) VALUES ?`;
values = [];
items.forEach((item) => {
values.push([order_id, item.book_id, item.quantity]);
})
results = await conn.query(sql, [values]);
return res.status(StatusCodes.OK).json(results[0]);
}
코드가 한결 간결해졌지요 ,,,
// orders 테이블 삽입
sql = `INSERT INTO orders (book_title, total_quantity, total_price, user_id, delivery_id)
VALUES (?, ?, ?, ?, ?)`;
values = [firstBookTitle, totalQuantity, totalPrice, userId, delivery_id];
[results] = await conn.query(sql, values);
order_id = results.insertId;
위 코드에서 `[results] = await conn.query(sql, values);` 라인은 비구조화 할당을 사용하여 `conn.query` 메서드로부터 반환된 배열의 첫 번째 요소를 추출합니다!
어떤 데이터가 들어가게 되는지 잘 이해가 안가서(..) 정리 해 보려고 합니다!
주문 데이터 삽입 과정
먼저 제가 postman에 삽입하는 데이터는 이런 형식입니다!
{
"items" : [
{
"book_id": 6,
"quantity" : 1
},
{
"book_id" : 7,
"quantity" : 1
},
{
"book_id" : 12,
"quantity" : 1
}
],
"delivery" : {
"address" : "광주시 북구",
"receiver" : "김광주",
"contact" : "010-7777-7777"
},
"firstBookTitle" : "백설공주들",
"totalQuantity" : 3,
"totalPrice" : 60000,
"userId" : 1
}
1. 배송 정보 삽입
주문에 대한 배송 정보를 `delivery` 테이블에 삽입합니다
INSERT INTO delivery (address, receiver, contact) VALUES (?, ?, ?);
- address: 광주시 북구
- receiver: 김광주
- contact: 010-7777-7777
배송정보가 성공적으로 삽입되면 `delivery_id`를 얻습니다
2. 주문 정보 삽입
다음으로 주문에 대한 정보를 `orders` 테이블에 삽입합니다
INSERT INTO orders (book_title, total_quantity, total_price, user_id, delivery_id)
VALUES (?, ?, ?, ?, ?);
- book_title: 백설공주들
- total_quantity: 3
- total_price: 60000
- user_id: 1
- delivery_id: 앞서 얻은 배송 정보의 delivery_id
주문 정보가 성공적으로 삽입되면 `order_id`를 얻습니다.
3. 주문 도서 정보 삽입
마지막으로 주문에 포함된 도서 정보를 `orderedBook` 테이블에 삽입합니다
INSERT INTO orderedBook (order_id, book_id, quantity) VALUES (?, ?, ?), (?, ?, ?), (?, ?, ?);
- 첫 번째 도서: order_id, book_id: 6, quantity: 1
- 두 번째 도서: order_id, book_id: 7, quantity: 1
- 세 번째 도서: order_id, book_id: 12, quantity: 1
각 도서 정보가 성공적으로 삽입되면 주문 프로세스가 완료됩니다.
결과 확인
모든 삽입 작업이 성공하면 results에는 마지막으로 삽입된 행의 정보가 포함되어 있습니다.
이 중에서 insertId 속성을 통해 각 단계에서 생성된 자동 증가 ID를 확인할 수 있습니다. ( •̀ᴗ•́ )و ̑̑
MySQL 데이터 삭제하는 방법
테이블을 만들다 보면 fk로 여기저기 엮인 테이블이 분명히!! 있을텐데요, 이때 테이블을 초기화 하고 싶을때,,
참조를 하고 있는 테이블의 데이터를 먼저 날리면 괜찮을거라고 생각했지만 아닙니다 ㅎ ㅎ
먼저 참조하고있는 테이블의 데이터를 삭제하고, 참조 당하는 테이블의 데이터를 삭제해도 외래키 제약조건때문에 삭제를 할 수 없게 돼요 ,,
이럴 때는 이 명령어를 사용하면 됩니다!
SET FOREIGN_KEY_CHECKS = 0;
그리고 각 테이블의 데이터를 삭제 한 뒤, 다시 원래대로 돌려 줍니다.
SET FOREIGN_KEY_CHECKS = 1;
1. DELETE 문
특정 조건을 만족하는 행을 삭제합니다. 행을 삭제하더라도 테이블 구조는 그대로 유지됩니다.
2. DROP 문
테이블 전체를 삭제합니다. 테이블의 정의와 함께 데이터도 모두 삭제됩니다.
3. TRUNCATE 문
테이블에서 모든 행을 삭제하지만, 테이블 구조는 그대로 유지됩니다.
DELETE : 선택적 삭제, 롤백 불가능, 특정 행만 삭제 가능
DROP : 테이블 전체 삭제, 복구 어려움, 테이블 구조 손실
TRUNCATE : 모든 행 삭제, 롤백 불가능, 테이블 구조는 유지
'데브코스 TIL' 카테고리의 다른 글
[웹 풀사이클 데브코스 TIL] 12주차 Day 2 - 타입스크립트의 다양한 타입(유니온타입, 타입 별칭, 타입 가드 ...) (0) | 2024.01.30 |
---|---|
[웹 풀사이클 데브코스 TIL] 9주차 Day 5 - JWT 예외처리, 에러 (0) | 2024.01.13 |
[웹 풀사이클 데브코스 TIL] 9주차 Day 3 - 비동기 처리 방법 (1) | 2024.01.10 |
[웹 풀사이클 데브코스 TIL] 9주차 Day 2 - 주문하기 flow 정리 (1) | 2024.01.09 |
[웹 풀사이클 데브코스 TIL] - 8주차 Day 3 - SQL 함수의 활용, 데이터베이스 페이징 (1) | 2024.01.04 |