26

db.Modelの代わりに (Flask-SQLAlchemy)を使用して、Alembic がクラスへの変更から候補の移行を自動生成するのに問題がありBaseます。

env.pyFlask アプリを作成し、関連するすべてのモデルをインポートし、データベースを初期化し、移行を実行するように変更しました。

...
uri = 'mysql://user:password@host/dbname?charset=utf8'
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = uri
app.config['SQLALCHEMY_ECHO'] = True
db.init_app(app)
with app.test_request_context():
    target_metadata = db.Model.metadata
    config.set_main_option('sqlalchemy.url', uri)
    if context.is_offline_mode():
        run_migrations_offline()
    else:
        run_migrations_online()
...

drop_all()このアプローチは、create_all()(たとえば、単体テスト用にテスト データベースを再作成する場合) には問題なく機能しますが、この場合はうまくいかないようです。自動生成されたバージョン スクリプトには、常に空のアップグレードおよびダウングレード メソッドがあります

def upgrade():
    ### commands auto generated by Alembic - please adjust! ###
    pass
    ### end Alembic commands ###


def downgrade():
    ### commands auto generated by Alembic - please adjust! ###
    pass
    ### end Alembic commands ###

私の変更には、インデックスと外部キーの変更だけでなく、列の名前変更、列定義の変更などが含まれます。

Flask-SQLAlchemy で Alembic を使用している人はいますか? どこが間違っているのか分かりますか?

どうもありがとう!

4

5 に答える 5

4

私の間違いは、データベースが既に最終状態にある状態で最初の移行を作成しようとしたことでした。既存のバージョンがないことに気づき、モデルに基づいていると考えていました。データベース内のすべてのテーブルを削除するまで空のバージョンを取得した後、正常に機能しました。

于 2016-08-08T13:34:42.883 に答える
-1

フラスコアランビックをお試しくださいhttps://github.com/tobiasandtobias/flask-alembic

昨日やってみました。操作以外は問題なくdrop動作します。sqliteでは機能しません(https://bitbucket.org/zzzeek/alembic/issue/21/column-renames-not-supported-on-sqlite)。

私がそれを使用した方法。最初に私python manage.py migrate revision --autogenerateはsqliteデータベースに空のテーブルを作成していました。それはそのような移行を生み出すでしょう

def upgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.create_table('users_user',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('name', sa.String(length=50), nullable=True),
    sa.Column('email', sa.String(length=120), nullable=True),
    sa.Column('password', sa.String(length=20), nullable=True),
    sa.Column('role', sa.SmallInteger(), nullable=True),
    sa.Column('status', sa.SmallInteger(), nullable=True),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('email'),
    sa.UniqueConstraint('name')
)
### end Alembic commands ###

def downgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.drop_table('users_user')
    ### end Alembic commands ###

それで -python manage.py migrate upgrade head

test = db.Column(db.String(20))次に、ユーザーモデルに新しい列を追加して、このコマンドを実行しましたpython manage.py migrate revision --autogenerate -m 'test field at users'

これにより、次のような移行が発生しました。

def upgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.add_column('users_user', sa.Column('test', sa.String(length=20), nullable=True))
    ### end Alembic commands ###


def downgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.drop_column('users_user', 'test')
    ### end Alembic commands ###
于 2012-09-19T09:03:07.877 に答える