FlaskとFlask-SQLAlchemyおよびFlask-Migrateを使用してアプリケーションを作成していますが、移行を作成しようとしても何も起こりません。
_app/models.py
_に2つのテーブルを作成しました。
_from flask import current_app
from . import db
class Student(db.Model):
__tablename__ = 'students'
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(64), unique=True, nullable=False)
password_hash = db.Column(db.String(128))
def __init__(self, **kwargs):
super(Student, self).__init__(**kwargs)
def __repr__(self):
return '<Tutor {}>' % self.id
class Tutor(db.Model):
__tablename__ = 'tutors'
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(64), unique=True, index=True)
password_hash = db.Column(db.String(128))
def __init__(self, **kwargs):
super(Tutor, self).__init__(**kwargs)
def __repr__(self):
return '<Student %r>' % self.id
_
次に、次のコードを持つ_app/__init__.py
_もあります。
_from flask import Flask
from flask_bootstrap import Bootstrap
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
#from .models import User, Task, Project, UserProject
from config import config
bootstrap = Bootstrap()
db = SQLAlchemy()
migrate = Migrate()
def create_app(config_name='default'):
#print config_name.name
app = Flask(__name__)
app.config.from_object(config[config_name])
config[config_name].init_app(app)
bootstrap.init_app(app)
db.init_app(app)
migrate.init_app(app, db)
## Register the main blueprint for main app functionality
from .main import main as main_blueprint
app.register_blueprint(main_blueprint)
return app
_
および_app.py
_:
_import os
from app import create_app, db
from app.models import Tutor, Student
app = create_app('default')
@app.Shell_context_processor
def make_Shell_context():
return dict(db=db, Tutor=Tutor, Student=Student)
_
_flask db init
_を問題なく実行でき、移行ディレクトリと必要なすべてのファイルが次の出力で作成されます。
_Creating directory /Users/Jasmine/projects/flask/flask-tutoring/migrations ... done
Creating directory /Users/Jasmine/projects/flask/flask-tutoring/migrations/versions ... done
Generating /Users/Jasmine/projects/flask/flask-tutoring/migrations/script.py.mako ... done
Generating /Users/Jasmine/projects/flask/flask-tutoring/migrations/env.py ... done
Generating /Users/Jasmine/projects/flask/flask-tutoring/migrations/README ... done
Generating /Users/Jasmine/projects/flask/flask-tutoring/migrations/alembic.ini ... done
Please edit configuration/connection/logging settings in '/Users/Jasmine/projects/flask/flask-tutoring/migrations/alembic.ini' before proceeding.
_
しかし、_flask db migrate
_を実行しようとすると、alembicは_app/models.py
_にテーブルがあることを検出できません。次の出力が得られます。
_INFO [alembic.runtime.migration] Context impl SQLiteImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.env] No changes in schema detected.
_
_models.py
_が存在しないかのように、移行スクリプトは作成されません。
これが繰り返される質問である場合はお詫びしますが、最初の移行が失敗し、移行スクリプトがまったく作成されない別の例を見つけることができません。
シェルでdb.drop_all()
を実行して、どこかにテーブルがすでに作成されているかどうかを確認しようとしましたが、それは問題ではないようです。
私は自分でこれを解決する方法を考え出しましたが、なぜこれが機能したのかをよりよく理解したいと思います。
_app.py
_の名前を_flasktutor.py
_に変更し、_export FLASK_APP='flasktutor.py'
_を再実行しました。その後、移行は完全に機能しました。
ファイルが_app.py
_と呼ばれ、私が_export FLASK_APP='app.py'
_を使用したときに、移行によってスキーマへの変更が登録されなかった理由を誰かが説明できますか。
これが私の場合の問題の解決方法です。
from flask_migrate import Migrate
_migrate = Migrate(app, db)
db.create_all()
DROP DATABASE db_name;
_CREATE DATABSE db_name OWNER owner_name;
_export FLASK_APP=name_app.py
_flask db migrate
_を実行します注:このエラーが発生する可能性がある場合は、6番目のステップを使用する必要があります:_Error: Could not locate a Flask application
_
これが誰かを助けることを願っています。
さて、私はミゲルグリンベルクのチュートリアルに続いて同じ問題に遭遇しました。
以前は、シェル呼び出しを使用してテーブルを作成しました
db.create_all()
だから、私はテーブルを落とすと思います
db.drop_all()
そして、migrateコマンドを再試行すると、期待どおりに機能しました。
Roberto@MyPC MINGW64 /e/Projects/Flask/flasky ((5c))
$ flask db migrate -m "initial migration - Role Users"
INFO [alembic.runtime.migration] Context impl SQLiteImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.autogenerate.compare] Detected added table 'roles'
INFO [alembic.autogenerate.compare] Detected added table 'users'
INFO [alembic.autogenerate.compare] Detected added index 'ix_users_username' on '['username']'
Generating E:\Projects\Flask\flasky\migrations\versions\4de323c9c089_initial_migration_role_users.py ... done
その後、flask-migrateを使用してテーブルを再作成しました
$ flask db upgrade
INFO [alembic.runtime.migration] Context impl SQLiteImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.runtime.migration] Running upgrade -> b641ee80a60d, initial migration - Role Users
私はこの問題に遭遇し、次のコメントの直後に移行フォルダーのenv.py
にモデルをインポートすることで解決しました
# add your model's MetaData object here
# for 'autogenerate' support
# from myapp import mymodel
# target_metadata = mymodel.Base.metadata
from app.models import Student, Tutor