300x250
반응형
모델 생성
from pybo import db
# Question 테이블 스키마 정의하는 클래스
class Question(db.Model):
id = db.Column(db.Integer, primary_key=True)
subject = db.Column(db.String(200), nullable=False)
content = db.Column(db.Text(), nullable=False)
create_date = db.Column(db.DateTime(), nullable=False)
class Question(db.Model) <-- db.Model을 상속하는 클래스
여기서 db는 __init__.py에서 정의한 db = SQLAlchemy() 이다
# Answer 테이블
class Answer(db.Model):
...
question_id = db.Column(db.Integer, db.ForeignKey('question.id', ondelete='CASCADE'))
question = db.relationship('Question', backref=db.backref('answer_set'))
...
question_id는 db.ForeignKey를 사용하여 다른 모델의 컬럼값 참조
qeustion은 db.relationship 사용하여 컬럼이 아닌 모델을 참조 (answer.question.subject처럼 가져올 수 있음)
question의 backref 옵션은 역참조 (양방향 참조) 설정
question_id의 cascade는 db에서 쿼리로 삭제될 때만 적용되고 파이썬 코드로 삭제 시에는 적용안됨
question.delete()할때 적용하려면 backref에서 casecade 설정해야 함
question = db.relationship('Question', backref=db.backref('answer_set', cascade='all, delete-orphan'))
테이블 (자동)생성
__init__.py 파일에 models.py 참조시키기
# ORM 전역변수 초기화
db.init_app(app)
migrate.init_app(app, db)
from . import models # migrate 객체가 models.py 참조하게 함
cmd에서 db migrate로 리비전 파일 생성
(myproject) C:\projects\myproject>flask db migrate
INFO [alembic.runtime.migration] Context impl SQLiteImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.autogenerate.compare] Detected added table 'question'
INFO [alembic.autogenerate.compare] Detected added table 'answer'
Generating C:\projects\myproject\migrations\versions\5bf32c0dfb6f_.py ... done
cmd에서 db upgrade로 리비전 파일 실행
(myproject) C:\projects\myproject>flask db upgrade
INFO [alembic.runtime.migration] Context impl SQLiteImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.runtime.migration] Running upgrade -> 5bf32c0dfb6f, empty message
dbeaver에서 pybo.db 열어보면 아래처럼 answer, question 테이블이 생성되어있고
스키마도 지정한 대로 짜여있음
300x250
반응형
'IT > 파이썬' 카테고리의 다른 글
플라스크에서 ORM 사용하기 4 - 라우팅 (0) | 2021.05.24 |
---|---|
플라스크에서 ORM 사용하기 3 - db에서 데이터 가져오기 (0) | 2021.05.24 |
플라스크에서 ORM 사용하기 1 (0) | 2021.05.23 |
플라스크 블루프린트 (0) | 2021.05.21 |
플라스크 서버 실행 세팅 (0) | 2021.05.21 |