이번주 깨달음
1.SQL로 집계 쿼리 작성하기
SELECT user_id, COUNT(*)
FROM users
GROUP BY user_id;
- 이런 집계 쿼리를 알고는 있었지만, 자주 타이핑할 일이 없다보니 분명히 아는 개념인데도, 실제 코드로 작성하는 것이 좀 어려웠는데 이제서야 확실히 감을 잡게 되었습니다!
2. SQLite 데이터 속성
- 저는 일반적인 SQL 데이터 속성이랑 별 다를게 없다고 생각했는데 조금 다른점이 있어서, 좀 명확하게 이를 정리해보는 시간을 가졌습니다
INTEGER : 정수를 저장
TEXT : 문자열을 저장, 날짜 타입도 TEXT로 저장
BLOB : 파일과 이미지 같은 이진 파일을 저장
REAL : 실수를 저장
PRIMARY KEY : 기본키 설정
AUTO INCREMENT : 기본키가 데이터가 들어올 때마다 1씩 순차적으로 증가
NOT NULL : Nullable = false
FOREIGN KEY : 외래키를 설정
- SQLite에서는 일반적인 SQL과 조금 다르게 외래키를 설정한다는 것을 알았습니다!
-- 일반적인 SQL
CONSTRAINT user_fk FOREIGN KEY (user_id) REFERENCES users(id)
-- SQLite
FOREIGN KEY (user_id) REFERENCES users(user_id)
3. cursor.rowcount
- 메시지 아이디를 이용해서 메시지를 삭제하는 API에서
deleted = cursor.rowcount 이 코드를 통해서 이 값이 0이면 삭제된 행이 없다 라고 판단하는 것이 신기했습니다.
deleted = cursor.rowcount이 코드가 쿼리 실행 후 영향을 받은 행의 갯수를 정수로 반환해준다는 것도 알게 되었고요!
@app.delete("/messages/{message_id}")
def delete_message(message_id: int):
conn = get_connection()
cursor = conn.cursor()
# ✏️ [실습] message_id에 해당하는 메시지를 삭제하는 DELETE 쿼리를 작성하세요.
cursor.execute("DELETE FROM messages WHERE messages.id = ?", (message_id,))
conn.commit()
deleted = cursor.rowcount
conn.close()
# ✏️ [실습] 삭제된 행이 없으면(deleted == 0) 404 에러를 반환하세요.
# 여기에 조건문을 작성하세요
if deleted == 0: # deleted가 의미하는 것이 뭔지 파이썬 자체에서 제공하는 건가?
raise HTTPException(status_code = 404, detail ="삭제된 행이 존재하지 않습니다")
return {"status": "deleted", "message_id": message_id}
4. Self-closing 태그
- 저는 HTML 공부를 하면서 태그를 열고 닫기가 너무 귀찮았었는데,
<br/> ,<img/>, <input/> 과 같이 태그를 열기만 하면 바로 닫히는 신물물의 존재에 대해서 알게되었습니다 다른 태그들도 다 이러면 좋겠습니다 ㅋㅋㅋㅋ
어려웠던 점
1. CSS
- 양이 방대하기도 했고, 아직까지는 flex 속성을 잘 다루는 것이 어려워서 1차 과제를 진행하면서, 조금더 요소의 위치를 신경쓰면서 배치하는 것에 대해서 노력해보려고 합니다!
2. FastAPI DB connection
- 아직 FastAPI에 익숙하지 않아서 실제로 DB에서 값을 꺼내오고 이를 수정하는 API를 명확하게 만들기 위해서는 추가적인 학습이 필요하다고 느꼈습니다. 그래서 간단한 코드를 작성해보면서 FastAPI DB를 어떻게 사용하는지 알아보았습니다.
conn = sqlite3.connect(DB_PATH) # datebase.py 에 정의하는 DB 파일을 읽어와서 연결, DB가 없으면 자동 생성
init_db() # 서버 시작 시 테이블을 자동 생성
conn = get_connection() # DB 설정을 열기
conn.row_factory = sqlite3.Row() # 조회 결과를 딕셔너리처럼 접근 가능하게 설정함
cursor = conn.cursor() # 직접 동작을 수행하는 펜의 역할! 이게 있어서 쿼리 실행이 가능
cursor.execute("SQL 쿼리", (값1, 값2)) # 쿼리에서 값에 해당 하는 부분은 ? 로 두고, 쿼리 뒤 위치하는 튜플에서 값을 바인딩
conn.commit() # 변경사항을 DB에 확정
conn.close() # 커넥션을 종료
cursor.fetchAll() #cursor.execute로 작성한 쿼리의 결과를 리스트로 반환함.
cursor.rowcount # cursor.execute로 영향을 받은 행의 갯수를 리턴
2주차 총평
- fastAPI에서 이용하는 DB 연결방법, 그리고 SQLite 문법을 잘 익혀보자
- CSS는 과제를 진행하면서 부딪히자
- 축제 다녀온 여파로 강의가 밀렸었는데, 절대 강의를 미루지 말자.. 내일의 내가 죽는다.
2주차 진행하면서 궁금했던 내용
- Spring backend에서는 @transactional 어노테이션을 통해서 해당 로직이 트랜잭션 내에서 안전하게 수행됨을 보장하는데 python 서버에서는 conn.commit()이 호출되는 시점에 쿼리가 DB로 날아가고 트랜잭션이 안전하게 종료되는지가 궁금합니다!
이번주 깨달음
1.SQL로 집계 쿼리 작성하기
2. SQLite 데이터 속성
3. cursor.rowcount
deleted = cursor.rowcount이 코드를 통해서 이 값이 0이면 삭제된 행이 없다 라고 판단하는 것이 신기했습니다.deleted = cursor.rowcount이 코드가 쿼리 실행 후 영향을 받은 행의 갯수를 정수로 반환해준다는 것도 알게 되었고요!4. Self-closing 태그
<br/>,<img/>,<input/>과 같이 태그를 열기만 하면 바로 닫히는 신물물의 존재에 대해서 알게되었습니다 다른 태그들도 다 이러면 좋겠습니다 ㅋㅋㅋㅋ어려웠던 점
1. CSS
2. FastAPI DB connection
2주차 총평
2주차 진행하면서 궁금했던 내용