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
※ 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 파일 생성됨.
3) DB upgrade
-. 터미널에 flask db upgrade 입력하면 아래와 같이 .db 파일 생성됨.
3. 생성된 DB 확인
-. SQLite browser 다운로드 이후 db를 열어보면 아래와 같이 내가 설정한 것 그대로 셋팅된 스키마를 볼 수 있다.
'python > Flask' 카테고리의 다른 글
[python] Flask - 게시판 만들기 (2) - 부트스트랩과 웹표준 (0) | 2021.02.21 |
---|---|
[python] Flask - 게시판 만들기 (1) (2) | 2021.02.21 |
[python] Flask - 모듈화, Blueprint 청사진 (0) | 2021.02.20 |
[Python] Flask - 주식차트 그리기 및 삽입 - 파이썬은 날먹 (2) | 2021.02.16 |
[Python] Flask + Jinja - 파이썬은 날먹 (0) | 2021.02.15 |
최근댓글