【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は環境変数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で見てみる
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)