【发布时间】:2021-09-02 06:53:12
【问题描述】:
我有一个flask-appbuilder (FAB) 项目,我想使用flask-migrate 来处理数据库迁移。但是 FAB 会事先自行创建数据库,因此 flask-migrate 无法计算迁移
我知道this example 和this issue on FAB's repository,但是我无法使用它们来解决问题。
这是一个显示问题的最小应用程序。
# 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,因此没有迁移。但是数据库已经创建。
注意:来自my issue on FAB's repo的交叉发帖
【问题讨论】:
-
我不使用 FAB,所以这只是一个可能有效也可能无效的建议,但是您是否尝试过删除 FAB 创建的初始数据库表?如果您删除表然后运行
flask db migrate我认为将生成迁移,从那时起您可以使用 Flask-Migrate 来管理您的数据库。 -
@Miguel,不幸的是,这些表是由 FAB 初始化自动创建的。首席开发人员将添加一个新配置以允许标准迁移模式:github.com/dpgaspar/Flask-AppBuilder/issues/…
标签: python flask flask-migrate flask-appbuilder