1

Postgresql バックエンドを持つ Flask アプリケーションで Flask-Migrate を使用しています。問題は、モデルに変更を加えた後、たとえば列の追加または削除を行った後、私が試したリビジョンまたは移行で、常に次のような結果が得られることです。

INFO  [alembic.autogenerate.compare] Detected added table u'foo'

のすべてのスクリプトには、テーブルを作成migrations/versionsするためのコードが含まれています。

def upgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.create_table('foo',
    ...
    )
    ### end Alembic commands ###

私は何かを期待していた

INFO  [alembic.autogenerate.compare] Detected added column u'foo.name'

def upgrade():
        ### commands auto generated by Alembic - please adjust! ###
        op.add_column('foo', sa.Column('name', ...
        )
        ### end Alembic commands ###

このブログの指示に従っています。関連する設定は次のとおりです。

    ### __init__.py
    import ...
    from flask.ext.script import Manager
    from flask.ext.migrate import Migrate, MigrateCommand

    app = Flask(__name__)
    app.config.from_object('config')
    db = SQLAlchemy(app)
    db.metadata.schema = app.config['DB_SCHEMA']
    migrate = Migrate(app, db)
    manager = Manager(app)
    manager.add_command('db', MigrateCommand)
    ...
    import myapp.models

    ###  models.py
    from myapp import db

    class Foo(db.Model):
        id = db.Column(db.Integer, primary_key = True)
        name = db.Column(db.String(50), nullable=False)

これらの質問で与えられた提案のいくつかに従いました: ( Alembic/Flask-migrate はデータベース構造を認識しません) および ( Flask-SQLAlchemy を使用した移行の Alembic 自動生成で変更は検出されません) 運がまったくありません。

私が間違っていることは何か分かりますか?

前もって感謝します。

解決済み

私はちょうど問題を発見しました。私はDBスキーマを使用するのが好きで、これを行っていました

    db.metadata.schema = app.config['DB_SCHEMA']

どういうわけか、スキーマalembicの固有のスコープを認識していないように見えるため、常にテーブルを再作成します。並べ替え:テーブルがありませんfoo-最も外側のグローバルな「スキーマ」またはスコープにあるため、createそのテーブルを使用する必要があります。これは、最初の移行でテーブルが正しく作成された後でも発生していました。もちろん、当然のことながら、2 回目の移行を実行すると、

    sqlalchemy.exc.ProgrammingError: (ProgrammingError) relation "foo" already exists

上記の宣言を削除したところ、変更が適切に表示されるようになりました。

    INFO  [alembic.autogenerate.compare] Detected added column 'foo.name'

スキームをサポートするために何か特別なことをしなければならないかどうかはわかりません。おそらく、これはサポートされていない機能です。

4

0 に答える 0