반응형

0. 들어가기

-. 코딩할 때 DB를 편하게 사용하는 방법으로 ORM 모듈을 이용한다. 또한 파이썬은 SQLAlchemy라는 매우 유명한 ORM과 함께, SQLite라는 토이프로젝트에 적합한 DB를 제공한다. 

-. 특히나 나는, 지금 서버에서 작업하는 게 아니라 개인 PC에서 작업 후 서버에서 재세팅(...) 해야하므로 최대한 간단 간단하게 갈거다.

-. 앞 포스팅과 동일하게, 위키독스 2공식 document를 보면서 진행한다. 

1. 모듈 설치 및 설정: Flask-Migrate

-. Flask를 이용해 서버 개발을 할 땐 SQLAlchemy을 기반으로 만든 Flask-Migrate라는 모듈을 사용하나보다.

Flask-Migrate is an extension that handles SQLAlchemy database migrations for Flask applications using Alembic. The database operations are made available through the Flask command-line interface or through the Flask-Script extension.

-. pip로 설치한다.

pip install Flask-Migrate

-. main.py가 있는 디렉토리에 config.py 파일을 생성하고 아래 줄 입력.

import os

BASE_DIR = os.path.dirname(__file__)

SQLALCHEMY_DATABASE_URI = 'sqlite:///{}'.format(os.path.join(BASE_DIR, 'WebStockDB.db')) #DB 주소
SQLALCHEMY_TRACK_MODIFICATIONS = False #모르는데 False

-. flask의 __init__.py 코드 수정

from flask import Flask, render_template, redirect, url_for
from .views import main_views, stock_views, board_views
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy

import config

db = SQLAlchemy()
migrate = Migrate()

def create_app():
    app = Flask(__name__)

    app.config.from_object(config)

    # ORM
    db.init_app(app)
    migrate.init_app(app, db)

    app.register_blueprint(main_views.bp)
    app.register_blueprint(stock_views.bp)
    app.register_blueprint(board_views.bp)

-. db 초기화 -> migrations 폴더에 파일들 생성됨.

>>> SET FLASK_APP=WebStockServer
>>> flask db init

<초기화 된 SQLite DB>

※ git에서 DB 파일들은 제외해주자.

2. 모듈 사용해보기

1) DB 모델 설정

-. 우선 DB에 들어갈 속성들을 설정해보자. Member와 ArticleRepository 모델을 설정해보겠다. 

-. DB 속성에 대해선 대부분 비슷하니.. 암거나 보자

-. 막상 쓰고나니 처음부터 너무 거창한거 아닌가 싶다... 타자치기 힘드네.

from WebStockServer import db


class Member(db.Model):
    __tablename__ = "MEMBER_TB"
    userid = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), nullable=False)
    email = db.Column(db.String(200), nullable=False)
    password = db.Column(db.String(200), nullable=False)
    nickname = db.Column(db.String(200), nullable=True)


class ArticleRepository(db.Model):
    __tablename__ = "ARTICLE_TB"
    articleID = db.Column(db.Integer, primary_key=True)
    articleSubject = db.Column(db.String(200), nullable=False)
    articleContent = db.Column(db.Text(), nullable=False)
    articleCreateTime = db.Column(db.DateTime(), nullable=False)
    userid = db.Column(db.Integer, nullable=False)


class CommentRepository(db.Model):
    __tablename__ = "COMMENT_TB"
    commentID = db.Column(db.Integer, primary_key=True)
    commentContent = db.Column(db.Text(), nullable=False)
    commentCreateTime = db.Column(db.DateTime(), nullable=False)
    userid = db.Column(db.Integer, nullable=False)
    articleID = db.Column(db.Integer, db.ForeignKey("ARTICLE_TB.articleID", ondelete='CASCADE'))
    article = db.relationship("ArticleRepository", backref=db.backref("comment_set"))

※ 보고 따라하는 wikidocs에서 수정할 점이 있는데, class 이름이 아니라 __tablename__ 으로 지정된 모델 자체 이름으로 레퍼런스 찍어야 foreignkey 설정이 가능하다. 버전 바뀌면서 달라진듯 링크참조

▶ ForeignKey(외래키)는 article과 comment를 연결해주는 역할. 
▶ ondelete: 부모(ArticleRepository)에서 articleID가 삭제될 때 행동 (bamdule.tistory.com/45)

 Cascade : 부모 데이터 삭제 시 자식 데이터도 삭제
 Set null : 부모 데이터 삭제 시 자식 테이블의 참조 컬럼을 Null로 업데이트
 Set default : 부모 데이터 삭제 시 자식 테이블의 참조 컬럼을 Default 값으로 업데이트
 Restrict : 자식 테이블이 참조하고 있을 경우, 데이터 삭제 불가
 No Action : Restrict와 동일, 옵션을 지정하지 않았을 경우 자동으로 선택된다.

▶ 그 외 설명은 역시 reference 참조.

2) DB migration

-. flask의 __init__.py 파일에 DBmodel을 import 해준 이후 터미널에서 flask db migrate 입력

db = SQLAlchemy()
migrate = Migrate()

def create_app():
    app = Flask(__name__)

    app.config.from_object(config)

    # ORM
    db.init_app(app)
    migrate.init_app(app, db)

    from . import DBmodels #(추가됨)
    
    
>>> flask db migrate

-. 아래 revision 파일 생성됨.

<DB revision 파일>

3) DB upgrade

-. 터미널에 flask db upgrade 입력하면 아래와 같이 .db 파일 생성됨.

<SQLite db 생성>

3. 생성된 DB 확인

-. SQLite browser 다운로드 이후 db를 열어보면 아래와 같이 내가 설정한 것 그대로 셋팅된 스키마를 볼 수 있다.

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기