Migrationを実施する際にモデルファイルを分けたい。
ディレクトリ階層
.
├── app.py
├── models.py
この場合、SQLAlchemyインスタンス化をmodel.pyで記載し、そのインスタンスを各モデルClassに継承する。
例えば下記の通り。
# model.py
from flask_sqlalchemy import SQLAlchemy
# ここに記載
db = SQLAlchemy()
class Todo(db.Model):
__tablename__: str = "todo"
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(255), nullable=False)
description = db.Column(db.String(1000))
completed = db.Column(db.Boolean, default=False)
def __init__(self, title, description, completed) -> None:
self.title = title
self.description = description
self.completed = completed
def __str__(self) -> str:
return f"title={self.title},description={self.description},completed={self.completed}"
こうすることでトップ層でアプリケーションを実行するファイルと分割し、DBモデリングを別のファイルで実施することができ、管理が簡単となる。
あとはapp.pyでdbインスタンスを呼び出し、初期化・マイグレーションをしてあげればDatabaseを作成できる。
# app.py
from flask import Flask
from flask_migrate import Migrate
from models import db
app = Flask(__name__)
# database定義に必要な設定
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///app.sqlite3"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
# 初期化、マイグレーション
db.init_app(app)
migrate = Migrate(app, db)
if __name__ == "__main__":
app.run(debug=True, port=8080)
あとは下記コマンドを打ち込むだけ。(.flaskenvにapp.pyの登録必須。)
flask db init
flask db migrate
flask db upgrade