Data processing with python shell

JeongChaeJin·2022년 12월 14일
0

점프 투 fastapi

목록 보기
3/4

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이전에 수행해야한다 !
    • db.rollback()

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()
profile
OnePunchLotto

0개의 댓글