티스토리 뷰

반응형
#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

 

Session API — SQLAlchemy 2.0 Documentation

Session API Session and sessionmaker() class sqlalchemy.orm.sessionmaker A configurable Session factory. The sessionmaker factory generates new Session objects when called, creating them given the configurational arguments established here. e.g.: from sqla

docs.sqlalchemy.org

 

반응형

'Python' 카테고리의 다른 글

[PYTHON] sorted()와 람다  (2) 2023.11.09
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함