Kuzunoha-NEのブログ

プログラミングなどの勉強をしてます

【Python】【Flask-Migration】 flask db init でKeyError: 'migrate'って表示された。

こんばんは、葛の葉です。

flask-migrationを使っていて、コマンドでflask db initと実行したらKeyError: 'migrate'と表示されて実行されないということがありました。

File "/usr/local/lib/python3.6/site-packages/flask_migrate/__init__.py", line 125, in init
directory = current_app.extensions['migrate'].directory
KeyError: 'migrate'

環境

Python 3.6.6

Flask 1.0.2

Flask-Migrate 2.3.2

flask db initをする前に

flaskの起動方法について、認識をちょっと改める必要があって、そもそもflaskを起動するには以下のようにするのがお約束のようです。

flask run

python [flaskが記述されたpythonファイル]では正しい方法では無いようです。

flask.pocoo.org

それで、flaskは環境変数FLASK_APPに入っているpyファイルを読み込む設定のようで、環境変数FLASK_APPに中身が存在しない場合は、app.pyを読み込むようになっているようです。hello.pyにflaskのコードがある場合は以下のようにします。

export FLASK_APP=hello.py
flask run

flask-migrateのコマンドflask init dbとする場合もFLASK_APPが該当のものでないと駄目のようです。

stackoverflowで見てみる

stackoverflow.com

from flask_migrate import Migrate
migrate = Migrate(app, db) 

こうしなさいと書いてあった。

結局こうなった

# app.py

from flask_migrate import Migrate

from factory import create_app
from objects.database import db

app = create_app()
migrate = Migrate(app, db)

if __name__ == '__main__':
    app.run()

app.pyがおいてる場所をカレントディレクトリにして、flask db initが動いた。

上記のインポート先のコード

# factory.py

from flask import Flask
from objects.database import db

def create_app():
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'hogehoge'
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
    db.init_app(app)
    return app
# objects/database.py
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

def init_db(app):
    db.init_app(app)