플라스크의 Migrate 기능을 이용해 데이터베이스 테이블을 생성할 수 있다.
생성한 모델을 플라스크 Migrate 기능이 인식할 수 있도록 __init__.py를 수정한다
(... 생략 ...)
# ORM
db.init_app(app)
migrate.init_app(app, db)
from . import models
(... 생략 ...)
추가한 모델로 DB가 변경되도록 명령 프롬프트에서 flask db migrate를 실행한다. migrations 디렉토리의 versions에 리비전이 생성된다.
이어서 flask db upgrade로 리비전 파일을 실행한다. 성공적으로 실행 시 모델과 같은 이름을 가진 테이블이 생성되고, 루트 디렉토리에 pybo.db가 생성된다.
flask shell 명령 실행 시 플라스크를 실행하는데 필요한 환경이 자동으로 설정되어 실행된다. 이 도구를 통해 모델을 사용할 수 있다. 정상작동 시 파이썬 인터프리터가 실행된다. 종료하려면 ctrl + z를 입력하면 된다.
모델의 객체를 만드는 형식으로 하나의 튜플을 생성할 수 있다.
>>> from pybo.models import Question, Answer
>>> from datetime import datetime
>>> q = Question(subject='pybo가 무엇인가요?', content='pybo에 대해서 알고 싶습니다.', create_date=datetime.now())
q를 DB에 저장하려면 다음처럼 SQLAlchemy db 객체를 사용한다. 트랙젝션을 취소하고 싶을 시 .commit()대신에 .rollback()을 해주면 된다.
>>> from pybo import db
>>> db.session.add(q)
>>> db.session.commit()
모델의 객체의 애트리뷰트 값을 확인하려면 q.애트리뷰트이름 으로 가능하다.
>>> q.id
1
>>> q.subject
'pybo가 무엇인가요?'
아래 실행 시 모델의 객체 리스트를 반환한다.
>>> Question.query.all()
[<Question 1>, <Question 2>]
필터로 질의할 수도 있다.
>>> Question.query.filter(Question.id==1).all()
[<Question 1>]
>>> Question.query.filter(Question.subject.like('%플라스크%')).all()
[<Question 2>]
기본키의 경우 get()을 이용할 수도 있다. 이때는 리스트가 아닌 객체 하나만 반환된다.
>>> Question.query.get(1)
<Question 1>
수정할 때는 단순히 대입하면 된다.
q = Question.query.get(2)
q.subject = 'Flask Model Question'
db.session.commit()
delete()함수로 삭제 가능하다.
q = Question.query.get(1)
db.session,delete(q)
db.session.commit()
Answer에 데이터를 추가한다.
>>> q = Question.query.get(2)
>>> a = Answer(question=q, content='네 자동으로 생성됩니다.', create_date=datetime.now())
>>> db.session.add(a)
>>> db.session.commit()
다음과 같이 질문에서, 답변에서 연결된 데이터를 볼 수 있다.
>>> a.question
<Question 2>
>>>q.answer_set
[<Answer 1>]