티스토리 뷰
반응형
#Pydantic Schema
from pydantic import BaseModel
from typing import List, Optional
from fastapi import FastAPI, HTTPException, Depends
from sqlalchemy.orm import Session
app = FastAPI()
class BookSchema(BaseModel):
id: int
title: str
author: str
is_available: bool
genre:str|None
#특정 저자의 모든 책 조회
@app.get("/books/author/{author_name}", response_model=List[BookSchema])
def get_books_by_author(author_name: str, session: Session = Depends(get_db)) -> List[BookSchema]:
books = session.query(Book).filter(Book.author == author_name).all()
if books:
return [BookSchema(**book.__dict__) for book in books]
raise HTTPException(status_code=404, detail="No books found by this author")
1. author_name: str, session: Session = Depends(get_db) 이란?
- author_name는 str, session은 get_db()함수로 부터 db세션을 객체로 받아 session 매개변수로 넘긴다.
- ex) name: str = "Alice" 이면 name변수가 str타입으로 명시, 초기값이 Alice
2. -> List[BookSchema] 혹은
def get_books_by_author(author_name: str, session: Session = Depends(get_db)) -> BookSchema: 이란?
- get_books_by_author의결과값으로 BookSchema의 값을 받는다.
- List[BookSchema]의경우 여러개를 받겠다 라는 뜻
- 위의 코드의 경우 List[BookSchema]: books = ~ 이므로 get_books_by_author의결과값으로 BookSchema값을 받는데 이 BookSchema는 books로 된 객체로 특정 저자의 모든책을 조회한 결과값(session.query(Book).filter(Book.author == author_name).all())이다.
3.books:Book|None = session.query(Book).filter(Book.author == author_name).all() 이란?
- Book|None : 특정 저자의 모든책을 조회한 결과값이 Book 객체거나 없을 경우 None으로 전달
- session.query(Book).filter(Book.author == author_name).all() : 특정 저자의 모든책을 조회한 결과값
4. [BookSchema(**book.__dict__) for book in books] 이란?
- 딕셔너리 언패킹: 객체의 속성을 함수,클래스 생성자에 전달 방식
def print_info(name, city):
print(f"Name: {name}, City: {city}")
info = {'name': 'chacha', 'age': 25, 'city': 'Seoul'}
#key는 새 딕셔너리에 포함될 각 키(key), info[key]는 해당 키에 대응되는 값을(value) 가져옴
filtered_info = {key: info[key] for key in info if key in ['name', 'city']}
print_info(**filtered_info)
#만약 infos일경우 리스트 컴프리헨션 + 딕셔너리 컴프리헨션을 결합해서 사용
infos = [
{'name': 'chacha', 'age': 25, 'city': 'Seoul'},
{'name': 'chacha2', 'age': 26, 'city': 'London'},
{'name': 'chacha3', 'age': 27, 'city': 'New York'}
]
filtered_infos = [{key: info[key] for key in info if key in ['name', 'city']} for info in infos]
- book.__dict__ : book 객체의 속성들을 포함하는 딕셔너리를 반환
- ** 연산자 : book.__dict__를 언패킹하여 BookSchema에 전달(book 객체의 모든 속성이 전달됨)
# Book 객체 생성
book = Book(id=1,title="python",author="chacha",is_abailable=True,genre="IT")
# Book 객체의 속성을 BookSchema의 인스턴스로 변환
book_schema = BookSchema(**book.__dict__)
- *연산자의 경우 튜플 언패킹으로 사용
def print_values(a, b, c):
print(a, b, c)
values = (1, 2, 3)
#튜플 언패킹
print_values(*values)
- BookSchema(*book.__dict__) 가 불가능한 이유 : * 연산자의 경우 위치기반의 언패킹으로 딕셔너리에 사용 불가, ** 연산자는 키-값을 키워드 인자로 언패킹하는데 사용
5. 새 책 추가(Post)
@app.post("/books", response_model=BookSchema)
def add_new_book(book_data: BookSchema, session: Session = Depends(get_db)) -> BookSchema:
book = Book(**book_data.dict())
session.add(book)
session.commit()
session.refresh(book)
return BookSchema(**book.__dict__)
열혈 파이썬 중급
https://docs.sqlalchemy.org/en/20/orm/session_api.html#sqlalchemy.orm.Session.query
반응형
'Python' 카테고리의 다른 글
[PYTHON] sorted()와 람다 (2) | 2023.11.09 |
---|
댓글