바로 이전에 등록한 docker-compose.yml을 실행시켜보도록 하겠습니다. 그러면 8001번 포트와 컨테이너의 5001번 포트와 연결시켜 주었기 때문에 아래와 같이 8001번 포트에서 Flask로 접속이 잘 됩니다.
이제 본격적으로 Flask에 Model을 만들고 migrate까지 해 보겠습니다.
이전에 flask_migrate, flask_script를 사용하는 과정에서 Flask 2.x.x을 사용하면 컨테이너에서 경로문제가 생기므로 일단 deprecated된 Flask 1.1.2버전을 사용하여 해결하도록 하겠습니다.
그리고 이를 하기 위해서 jinja2 2.1.3과 itsdangerous 2.0.1을 명시적으로 requirements.txt에 작성하고 reinstall을 해주었습니다.
( 1.xx버전으로 해서 경로 바꿔주면 되긴 하는데 나중에 배포때 걸림돌이 될까봐 그냥 이렇게 진행하였습니다. )
/requirements.txt
jinja2 == 3.0.3
itsdangerous == 2.0.1
Flask == 1.1.2
Flask-SQLAlchemy == 2.5.1
SQLAlchemy == 1.3.20
Flask-Migrate == 2.5.3
Flask-Script == 2.0.6
Flask-Cors == 3.0.9
requests == 2.25.0
mysqlclient == 2.0.1
pika == 1.1.0
그리고 docker-compose up을 다시해줍니다.
/main.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_cors import CORS
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@db/main'
# 추가적으로 메모리를 필요로 하는 작업을 비활성화 한다.
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
CORS(app)
db = SQLAlchemy(app)
class Shop():
id = db.Column(db.Integer, primary_key=True, autoincrement=False)
shop_name = db.Column(db.String(200))
shop_address = db.Column(db.String(200))
class Order():
id = db.Column(db.Integer, primary_key=True, autoincrement=False)
shop = db.Column(db.Integer)
address = db.Column(db.String(200))
# user가 '/'경로로 들어올 경우
@app.route('/')
def index():
return 'hello'
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=5001)
다음과 같이 SQLAlchemy를 통해 Shop, Order 모델을 만들었습니다. 이는 Django에서 모델을 만들때와 비슷합니다. 하지만 Shop, Order의 autoincrement에 False를 넣어주었습니다. 그 이유는 다른 db와의 동기화 문제를 해결하기 위함입니다. 같은 db인데 id (pk)가 다르면 안되기 때문입니다.
그리고 SQLALCHEMY_DATABASE_URI에 이전에 docker-compose에서 설정해준 환경변수로 적절히 mysql uri를 적어주었습니다.
또한 migrate를 하는 과정을 진행해 주어야 합니다. 우선 cli로 이를 가능하기 위해 아래와 같이 manage.py를 작성해 주도록 하겠습니다.
/manage.py
from main import app, db
from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager
migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)
if __name__ == '__main__':
manager.run()
그냥 이 스크립트를 실행하면 db로 시작하는 명령을 기다리는 것이라고 보시면 됩니다.
그 다음 boss-backend-1 쉘로 들어가줍니다.
$docker exec -it boss-backend-1 bash
/app경로에서 아래 명령어를 3개를 실행해 줍니다.
$python manage.py db init
$python manage.py db migrate
$python manage.py db update
이제 db의 마이그레이션은 끝난겁니다. 다음부터는 RabbitMQ설정을 본격적으로 진행해 보도록 하겠습니다.