web-dev-qa-db-ja.com

Flask-最初の移行時にスキーマへの変更は検出されませんでした

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'_を使用したときに、移行によってスキーマへの変更が登録されなかった理由を誰かが説明できますか。

5
J Finer

これが私の場合の問題の解決方法です。

  1. 移行モデルのインポート:_from flask_migrate import Migrate_
  2. 移行クラスを開始します:migrate = Migrate(app, db)
  3. コメントdb.create_all()
  4. 今すぐあなたのデータベースを削除する=> _DROP DATABASE db_name;_
  5. もう一度作成してください=> _CREATE DATABSE db_name OWNER owner_name;_
  6. エクスポートするflaskエントリファイル=> _export FLASK_APP=name_app.py_
  7. _flask db migrate_を実行します

注:このエラーが発生する可能性がある場合は、6番目のステップを使用する必要があります:_Error: Could not locate a Flask application_

これが誰かを助けることを願っています。

1
DINA TAKLIT

さて、私はミゲルグリンベルクのチュートリアルに続いて同じ問題に遭遇しました。

以前は、シェル呼び出しを使用してテーブルを作成しました

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
1
RobertoW

私はこの問題に遭遇し、次のコメントの直後に移行フォルダーの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
1
Swaleh Matongwa