使用 Flask-migration 和 Flask-appbuilder

问题描述 投票:0回答:2

我有一个

flask-appbuilder
(FAB) 项目,我想使用
flask-migrate
来处理数据库迁移。但是 FAB 事先自行创建了数据库,因此
flask-migrate
无法计算迁移

我知道这个例子FAB存储库上的这个问题,但是我无法使用它们来解决问题。

这是一个显示问题的最小应用程序。

# app.py
from flask import Flask
from flask_appbuilder import AppBuilder, SQLA
from flask_migrate import Migrate
import os
from flask_appbuilder import Model
from sqlalchemy import Column, Integer


class Config():
    basedir = os.path.abspath(os.path.dirname(__file__))
    SQLALCHEMY_DATABASE_URI = \
        'sqlite:///' + os.path.join(basedir, 'app.db')
    SQLALCHEMY_TRACK_MODIFICATIONS = False


db = SQLA()
migrate = Migrate()
appbuilder = AppBuilder()


def create_app(config_class=Config):
    app = Flask(__name__)
    app.config.from_object(config_class)
    db.init_app(app)
    migrate.init_app(app, db)

    with app.app_context():
        appbuilder.init_app(app, db.session)
        appbuilder.post_init()

    return app


class MyTable(Model):
    __tablename__ = "my_table"

    id = Column(Integer, primary_key=True)
    mycol = Column(Integer)


if __name__ == "__main__":
    app = create_app()
    app.run()

可以在虚拟环境中进行测试,如下

requirements.txt

flask-appbuilder==3.1.0
SQLAlchemy==1.3.24
flask-migrate

通过发行

export FLASK_APP=app.py
flask db init
flask db migrate

输出为

INFO [alembic.env] No changes in schema detected
,因此没有迁移。但是数据库已经创建了。

注意:交叉发布我在 FAB 存储库上的问题

python flask flask-migrate flask-appbuilder
2个回答
0
投票

这解决了我的问题。

$ flask db stamp head # Set current revision in the database to be head
$ flask db migrate
$ flask db upgrade

0
投票

关键是在第一次

运行
alembic_version
之前删除所有表(FAB生成的表和
flask db upgrade)。

这里有详细的解释。

从您的项目views.py中,找到该行

db.create_all()
并将其注释掉。

安装

flask-migrate


转到

init.py 添加进口 从flask_migrate导入迁移

添加在

db = SQLA(app)

之后

migrate = Migrate(app, db)
设置完成。  现在,如果您之前运行过该项目,您的表就已经存在。  放下它们。

现在项目中只有一次初始化迁移:

flask db init
这将初始化迁移,同时也会创建所有 FAB 表。  请注意这一点。

现在做

flask db migrate
这将创建 

alembic_version

 表。

如果您现在执行

flask db upgrade

,它将锁定。  一次且仅一次,删除数据库中的所有表,然后
然后运行:

flask db upgrade
现在您可以正常进行迁移了。  更改模型中的内容,然后执行以下操作:

flask db migrate flask db upgrade
现在不要扔掉桌子。

© www.soinside.com 2019 - 2024. All rights reserved.