INDEX
이번 포스트는 macOS Mojave 10.14.5 에서 수행된 작업입니다.
개발 환경
MacBook Pro (13-inch, 2017, Four Thunderbolt 3 Ports)
Python 3.7
vscode
Docker-Compose version 1.23.2, build 1110ad01
Model 만들기, ORM 적용 SQLAlchemy
, Marshmallow
종속성을 설치합니다
1 $ pipenv install flask_sqlalchemy flask-marshmallow Flask-Migrate pymysql
환경변수를 작성합니다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 """ 상수 클래스 """ SQLALCHEMY_DATABASE_URI = ("mysql+pymysql://{USER}:{PASSWORD}@{ADDR}:{PORT}/{NAME}?charset=utf8" ) SQLALCHEMY_DATABASE_URI_FORMAT = SQLALCHEMY_DATABASE_URI.format( USER="[사용자 ID]" , PASSWORD="[사용자 PW]" , ADDR="127.0.0.1" , PORT=3306 , NAME="[사용할 DB]" )
이제 app
에 설치한 SQLAlchemy
, Marshmallow
를 달아 봅시다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 """ APP을 실행하기 위해 config file """ from flask import Flaskfrom app.api.database import DB, MAfrom app.constants import SQLALCHEMY_DATABASE_URI_FORMATdef create_app () ->(Flask): """ create_app()을 호출하여 app을 초기화 """ app = Flask(__name__) app.app_context().push() app.config['DEBUG' ] = True app.config['SQLALCHEMY_ECHO' ] = True app.config['SQLALCHEMY_DATABASE_URI' ] = SQLALCHEMY_DATABASE_URI_FORMAT DB.init_app(app) MA.init_app(app) @app.route('/') def root () : """ main page """ return "Hello World!" return app
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 """ APP manage file """ from flask_script import Managerfrom flask_migrate import Migrate, MigrateCommandfrom app import create_appfrom app.api.database import DBfrom app.users.models import Users, UsersSchemaAPP = create_app() MANAGER = Manager(APP) MIGRATE = Migrate(APP, DB) MANAGER.add_command('db' , MigrateCommand) @MANAGER.command def run () : """ Command Application run """ APP.run() @MANAGER.command def out () : """ test command out method """ return "Test command" if __name__ == '__main__' : MANAGER.run()
Database
에 User
모델을 ORM
으로 설계합니다User
모델을 작성합니다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 """ Users models file """ from sqlalchemy.sql import textfrom app.api.database import DB, MAfrom flask_sqlalchemy import SQLAlchemyfrom marshmallow import Schema, fields, validateclass Users (DB.Model) : __tablename__ = 'users' __table_args__ = {'mysql_collate' : 'utf8_general_ci' } id = DB.Column(DB.Integer, primary_key=True ) user_id = DB.Column(DB.String(255 ), unique=True , nullable=False ) user_password = DB.Column(DB.String(255 ), nullable=False ) user_email = DB.Column(DB.String(255 ), nullable=False ) created = DB.Column(DB.TIMESTAMP, server_default=text("CURRENT_TIMESTAMP" ), nullable=False ) def __init__ (self, user_id, user_password, user_email) : self.user_id = user_id self.user_password = user_password self.user_email = user_email class UsersSchema (MA.Schema) : not_blank = validate.Length(min=1 , error='Field cannot be blank' ) id = fields.Integer(dump_only=True ) user_id = fields.String(validate=not_blank) user_password = fields.String(validate=not_blank) user_email = fields.String(validate=not_blank) created = fields.String(validate=not_blank)
1 2 3 4 5 6 7 8 9 10 11 """ Create db """ from flask_sqlalchemy import SQLAlchemyfrom flask_marshmallow import MarshmallowDB = SQLAlchemy() MA = Marshmallow()
설계한 ORM
을 데이터베이스에 적용 시킵니다
db
라는 커맨드로 추가해줬으니 init
으로 migrations
폴더를 생성합니다
1 $ python manage.py db init
이렇게 해준 뒤 데이터베이스를 보게 되면 다음과 같은 화면을 볼 수 있습니다
이는 데이터베이스만 생성시키는 작업을 합니다
현재 모델에 대한 모든 변경 사항을 감지를 못하고, 스크립트를 검토해 Database
에 적용 시킵니다
1 $ python manage.py db migrate
이러면 테이블이 생긴 모습을 확인할 수 있습니다
ORM구조가 변경 될 경우 데이터베이스 모델이 변경 될 때마다 migrate
, upgrade
를 해주어야 합니다 테이블을 동기화
하기 위해서요
1 $ python manage.py db upgrade
현재까지의 폴더 구조는 아래와 같습니다
INDEX