IT/파이썬

플라스크에서 ORM 사용하기 2 - 모델 및 테이블 생성

thesse 2021. 5. 23. 22:47
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

 

이렇게 파일 두개 생성됨. 위는 리비전 파일. 아래는 db 파일

dbeaver에서 pybo.db 열어보면 아래처럼 answer, question 테이블이 생성되어있고

스키마도 지정한 대로 짜여있음

 

300x250
반응형