모델을 이용해 테이블 자동 생성
모델 import
[projects\myproject\pybo\__init__.py]
...
# ORM
db.init_app(app)
migrate.init_app(app, db)
from . import models
...
리비전 파일 생성
(myproject) c:\projects\myproject> flask db migrate
명령어 수행 시 15637565s123_.py와 같은 데이터베이스 변경 작업을 위한 리비전 파일 생성
리비전? .py를 제외한 파일명 / 명령어 수행 시 무작위로 만들어진다.
리비전 파일 실행
(myproject) c:\projects\myproject> flask db upgrade
데이터베이스 모델 이름과 같은 question과 answer라는 이름의 테이블이 생성된다.
projects\myproject\pybo.db 파일 생성된다.
모델 사용하기
플라스크 셸 실행하기
(myproject) c:\projects\myproject>flask shell
파이썬 셸과는 별개다.
질문 저장하기
>>> from pybo.models import Question, Answer
>>> from datetime import datetime
>>> q = Question(subject='pybo가 무엇인가요?', content='pybo에 대해서 알고 싶습니다.', create_date=datetime.now())
create_date 속성은 DateTime 유형으로 datetime.now 함수로 현재 일시를 불러온다.
>>> from pybo import db
>>> db.session.add(q)
>>> db.session.commit()
db.session은 데이터베이스와 연결된 세션, 접속의 상태를 의미한다.
이 세션을 통해 데이터를 저장, 수정, 삭제 작업을 한다.
그 후에는 반드시 db.session.commit()으로 커밋해야 한다.
이 작업을 거쳐야 데이터베이스에 데이터가 저장된다.
커밋은 취소할 수 없다.
수행한 작업을 취소하고 싶으면 커밋 이전에 db.session.rollbak()을 실행해야 한다.
데이터 접근하기
데이터 조회하기
>>> Question.query.all()
[<Question 1>, <Question 2>]
Question.query.all()로 데이터베이스에 저장된 질문을 전부 조회한다.
결과의 숫자 1, 2는 Question 객체의 id 속성값이다.
>>> Question.query.filter(Question.id==1).all()
[<Question 1>]
filter 함수를 이용해 조건을 걸 수 있다.
id 처럼 유일한 값으로 조회할 때는 filter 함수 대신 get 함수를 이용할 수 있다.
>>> Question.query.get(1)
<Question 1>
get 함수는 1개의 반환만 가능하다는 점을 유의해야 한다.
>>> Question.query.filter(Question.subject.like('%플라스크%')).all()
[<Question 2>]
filter 와 like를 이용해 제목에 특정 문자열이 포함된 질문을 조회할 수 있다.
문자열% : 문자열로 시작하는 지
%문자열 : 문자열로 끝나는 지
%문자열% : 문자열이 포함된는 지
데이터 수정하기
>>> q = Question.query.get(2)
>>> q
<Question 2>
>>> q.subject = 'Flask Model Question'
>>> db.session.commit()
단순 대입 연산자를 통해 데이터를 수정할 수 있다.
반드시 commit을 해야 데이터베이스에 반영된다.
데이터 삭제하기
>>> q = Question.query.get(1)
>>> db.session.delete(q)
>>> db.session.commit()
삭제도 커밋이 필요하다.
이후 모든 질문을 조회하면 두 번째 질문만 남는다.
답변 데이터 저장하기
>>> from datetime import datetime
>>> from pybo.models import Question, Answer
>>> from pybo import db
>>> q = Question.query.get(2)
>>> a = Answer(question=q, content='네 자동으로 생성됩니다.', create_date=datetime.now())
>>> db.session.add(a)
>>> db.session.commit()
답변을 생성하려면 연결할 질문이 필요하다.
q = Question.query.get(2)
id가 2인 질문을 조회하여 q 객체에 저장한다.
a = Answer(question = q ... )
Answer 모델의 question 속성에 위에서 조회한 q 객체를 대입해 답변을 생성한다.
question_id에 값을 지정하지 않아도 자동으로 저장된다.
답변에 연결된 질문 찾기
>>> a.question
<Question 2>
질문에 연결된 답변 찾기
>>> q.answer_set
[<Answer 1>]
Answer 모델의 question 속성에 역참조 설정 backref = db.badkref('answer_set')이 적용되어 있다.
이를 사용하면 질문에 연결된 답변들을 쉽게 가져올 수 있다.
플라스크 셸 종료
< Ctrl + z > 후 < Enter >
quit() 입력
'Backend > Server' 카테고리의 다른 글
[Spring] API 작성하기 (0) | 2023.08.02 |
---|---|
[Flask] 질문 목록과 상세 기능 (0) | 2023.07.31 |
[Flask] 데이터 처리하기 (DB) (1) (0) | 2023.07.27 |
[Flask] 블루프린트 (0) | 2023.07.27 |
[Flask] 플라스크 애플리케이션 팩토리 (0) | 2023.07.26 |