모델 만들기 - 파이썬으로 데이터 다루기

Red_Panda·2021년 3월 10일
0

모델 : 데이터를 다룰려고 만든 파이썬 클래스

질문 답변 게시판을 만들기 위한 질문, 답변에 해당하는 모델을 만들어야한다.

각 모델에 필요한 속성은 아래와 같다. 또, 개인적으로 sqlalchemy_uitls IPAdress를 이용해 ip 속성도 추가해봤다. ip를 이용한 기능은 다양하지만 그 중 내가 만들어 볼 만한 기능을 찾아봐야겠다.

질문 모델
1. id : 질문 데이터 고유 번호
2. subject : 질문 제목
3. content : 질문 내용
4. create_date : 질문 작성일시

속성 모델
1. id : 답변 데이터 고유 번호
2. question_id : 질문 데이터 고유 번호 (어떤 질문에 답변한 것 인지 알아야 함)
3. content : 답변 내용
4. create_date : 답변 작성일시

이제 위 내용을 바탕으로 pybo 디렉토리에 models.py 파일을 생성하고 질문, 답변 클래스를 만들자.

Question은 질문 클래스(질문 모델), Answer는 답변 클래스(답변 모델)다.

아래는 질문 모델이다.

Interger : 숫자값
String : 글자 수가 제한된 텍스트
Text : 글자 수가 제한되지 않은 텍스트
DataTime : 날짜와 시각

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)

db.Cloumn()안의 첫번째 인수는 속성에 저장할 데이터 타입이다.
primary_key는 기본키 라고해서, 중복되지않는 고유한 값을 가진다. 각 데이터를 구분할 때 사용된다.
nullable값은 해당속성의 빈칸 허용 여부다. True 일경우 허용, False 일경우 허용x

아래는 답변 모델이다.

class Answer(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    question_id = db.Column(db.Integer, db.ForeignKey('question.id', ondelete='CASCADE'))
    question = db.relationship('Question', backref=db.backref('answer_set', cascade='all, delete-orphan'))
#cascade='all, delete-orpahn' 
    content = db.Column(db.Text(), nullable=False)
    create_date = db.Column(db.DateTime(), nullable=False)

question_id 속성은 질문 모델과 연결하는 용도다. 답변은 어느 질문에 대한 답변인지 표시해야하기 때문에, 질문 모델과 연결된 속성을 포함해야한다. 속성을 연결하는 방법은 db.ForeignKey을 이용하면 된다. 연결할 모델과 속성을 첫번째 인자로 넣어주면된다.

question_id의 속성은 질문 모델 id 속성과 연결된다. 그래서, ondelete='CASCADE'에 의해 질문을 삭제하면 해당 질문의 답변도 함께 삭제된다.

question은 답변 모델에서 질문 모델 객체의 제목을 참조하기 위함이다. db.relationship으로 속성을 추가하면 된다.

db.backref('answer_set') 는 역참조다. 1개의 질문에 n개의 답변이 달릴 수 있는데, 이런경우 질문에 달린 답변을 참조할 수 있게 한다. 질문객체.answer_set과 같은 코드로 해당 질문의 답변을 참조할 수 있다.

cascade='all, delete-orphan' 은 질문 데이터를 삭제할 때 연관된 답변 데이터를 삭제시키는 옵션이다. 굳이 설정하지 않아도 삭제된 것처럼 보이는데 실제로는 db에 답변 데이터는 살아있지만 빈값으로 보여 삭제된 것처럼 보인다.

이제 __init__.py를 수정해 작성한 모델들을 가져오면 된다.

위 코드를 넣어 migrate 기능이 인식할 수 있게 해주자.


그리고 cmd를 열어 작성한 클래스들로 db가 변경되도록 flask db migrate를 실행하자. 그러면 이름이 무작위같은 파일이 하나생기는데 이를 리비전 파일이라고 한다. 수정후에 db migrate를 할때마다 파일이 새로 생긴다.
이 파일로 db 스키마를 관리한다.

이제 flask db upgrade명령으로 리비전 파일을 실행하면, pybo.db에 question, answer 테이블이 생긴다. 처음에 ip 부분때문에 NameError: name 'sqlalchemy_utils' is not defined 라는 문구때문에 upgrade가 안됐었는데, 스택오버플로우에서 같은질문에 sqlalchemy_utils를 추가하라는 답변을 보고 해결했다.
여기 script.py.mako 파일에 import sqlalchemy_utils를 추가해주면 된다.

SQLite를 이용해 테이블이 생성된 것을 확인했다.

다음은 오늘 만든 모델들을 사용 해볼것이다.

profile
신입 개발자

0개의 댓글