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
# ./app/constants.py 생성

"""
상수 클래스
"""

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/__init__.py

"""
APP을 실행하기 위해 config file
"""

from flask import Flask
from app.api.database import DB, MA
from app.constants import SQLALCHEMY_DATABASE_URI_FORMAT

def 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
# ./manage.py

"""
APP manage file
"""

from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
from app import create_app
from app.api.database import DB
from app.users.models import Users, UsersSchema

APP = 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()



DatabaseUser 모델을 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
# ./app/users/models.py

"""
Users models file
"""
from sqlalchemy.sql import text
from app.api.database import DB, MA
from flask_sqlalchemy import SQLAlchemy
from marshmallow import Schema, fields, validate

class 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
# ./app/api/database.py

"""
Create db
"""

from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow

DB = 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