[오늘의 배움] 007 플라스크 테이블과 DB CRUD

이상민·2020년 11월 30일
0

[오늘의 배움]

목록 보기
7/70
post-thumbnail

1. 테이블

플라스크의 Migrate 기능을 이용해 데이터베이스 테이블을 생성할 수 있다.

1-1. 모델 가져오기

생성한 모델을 플라스크 Migrate 기능이 인식할 수 있도록 __init__.py를 수정한다

(... 생략 ...)
    # ORM
    db.init_app(app)
    migrate.init_app(app, db)
    from . import models
(... 생략 ...)

1-2. DB 변경을 위한 리비전 파일 생성과 DB 갱신

추가한 모델로 DB가 변경되도록 명령 프롬프트에서 flask db migrate를 실행한다. migrations 디렉토리의 versions에 리비전이 생성된다.

이어서 flask db upgrade로 리비전 파일을 실행한다. 성공적으로 실행 시 모델과 같은 이름을 가진 테이블이 생성되고, 루트 디렉토리에 pybo.db가 생성된다.


2. 모델 사용하기

2-1. 플라스크 셸

flask shell 명령 실행 시 플라스크를 실행하는데 필요한 환경이 자동으로 설정되어 실행된다. 이 도구를 통해 모델을 사용할 수 있다. 정상작동 시 파이썬 인터프리터가 실행된다. 종료하려면 ctrl + z를 입력하면 된다.

2-2. 데이터 저장

모델의 객체를 만드는 형식으로 하나의 튜플을 생성할 수 있다.

>>> 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가 무엇인가요?'

2-3. 데이터 조회

아래 실행 시 모델의 객체 리스트를 반환한다.

>>> 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>

2-4. 데이터 수정

수정할 때는 단순히 대입하면 된다.

q = Question.query.get(2)
q.subject = 'Flask Model Question'
db.session.commit()

2-5. 데이터 삭제

delete()함수로 삭제 가능하다.

q = Question.query.get(1)
db.session,delete(q)
db.session.commit()

2-6. 연결된 데이터 찾기

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>]
profile
편하게 읽기 좋은 단위의 포스트를 추구하는 개발자입니다

0개의 댓글