Question data
- shell 창에서 python bash로 테스트를 진행했다.
>>> from models import Question, Answer
>>> from datetime import datetime
>>> q = Question(subject="나는 누군가", content="여긴 또 어딘가", create_date=datetime.now())
- 모델에서 정의한 내용에 맞게 Question model을 갖는
q
라는 Instance 를 만든다.
- 이렇게 한다고 저장되는 것은 아니다.
>>> from database import SessionLocal
>>> db = SessionLocal()
>>> db.add(q)
>>> db.commit()
- database.py에 지정한 SessionLocal 객체를 통해 add -> commit flow를 진행하여 data(q Instance가 담고있는 정보)를 저장한다.
- 저장, 수정, 삭제 로직 처리 후 꼭 commit() 해줘야된다 !
>>> q.id
1
>>> q = Question(subject="Lotto", content="어디서 사야 붙노", create_date=datetime.now())
>>> q.id
>>> db.add(q)
>>> db.commit()
>>> q.id
2
- id는 Question model에서 Integer Type의 Primary Key다.
- 예상한 대로 저장할 때마다 id가 1씩 증가하는 것을 확인했다.
rollback
이 필요한 상황에서는 반드시 commit이전에 수행해야한다 !
Data 조회
>>> db.query(Question).all()
[<models.Question object at 0x7f7db76e4cd0>, <models.Question object at 0x7f7db771a9d0>]
- DB에 저장된 모든 Question을 조회한 것이다.
>>> db.query(Question).filter(Question.id==1).all()
[<models.Question object at 0x7f7db76e4cd0>]
- filter() 함수를 통해서 전달한 조건에 맞는 데이터를 야무지게 반환받을 수 있다.
db.query(Question).get(1)
<models.Question object at 0x7f7db76e4cd0>
- id는 유일한 값이므로 get() method를 사용해서 객체를 얻을 수 있는데, 이 때는 list가 아니라 해당 객체 하나만 나오니 주의한다.
>>> db.query(Question).filter(Question.subject.like("%Lotto%")).all()
[<models.Question object at 0x7f7db771a9d0>]
- subject에 Lotto라는 문자열이 담겨있는 question을 조회해본 것이다.
- %Lotto : Lotto로 끝나는 문자열
- Lotto% : Lotto로 시작하는 문자열
- %Lotto% : Lotto를 포함하는 문자열
- 대소문자 구분없으려면
ilike
함수 사용
- 조회하는 다양한 방법 - 공식문서
Data 수정
>>> q = db.query(Question).get(2)
>>> q.id
2
>>> q.subject = "FastAPI Model Question"
>>> db.commit()
- 두 번째 질문의 subject 속성을 수정한 것이다.
- 데이터 변경 후 commit은 필수다.
Data 삭제
>>> q = db.query(Question).get(1)
>>> db.delete(q)
>>> db.commit()
>>> db.query(Question).all()
[<models.Question object at 0x7f7db76a3a00>]
- 삭제 역시 delete()이후 commit()을 수행해야하며, ㄹㅇ 사라졌다 ㄷㄷ .. !
Answer Data
Data 저장
from models import Answer
>>> q = db.query(Question).get(2)
>>> a = Answer(question=q, content='허허', create_date=datetime.now())>>> db.add(a)
>>> db.commit()
- Answer의 Instance a의 question 속성에 2번 째 id question을 대입하여 답변을 생성했다.
- a는 question_id 라는 속성도 있을 텐데, question 속성에 q를 대입했기 때문에 지정할 필요없이 자동으로 입력된다.
답변에 연결된 질문 vs 질문에 달린 답변 찾기
>>> a = db.query(Answer).get(1)
>>> a
<models.Answer object at 0x7f7db76c5520>
>>> a.question
<models.Question object at 0x7f7db76a3a00>
- answer isntance에 question 속성이 있어 답변에 연결된 질문 찾기는 So Easy 하다.
>>> q = db.query(Question).get(2)
>>> q.answers
[<models.Answer object at 0x7f7db76c5520>]
Questino
, Answer
모델을 서로 연결된 상태이고, Answer 모델의 question 속성에서 역참조 설정인 backref
했기 때문에 질문에 달린 답변 찾기도 위 처럼 Easy 하게 할 수 있다.
exit()