Flask-Migrate

在使用Flask-SQLAlchemy来定义模型,然后使用Flask-Migrate自动生成迁移脚本以部署到MySQL数据库过程中,我们可能会在应用程序中使用的数据库中定义许多SQL Views辅助查询。

但是在迁移命令migrate后,Flask-Migrate现在会为该视图生成一个迁移文件,因为它认为它是一个表格。如何在迁移过程中让Flask-Migrate忽略视图?

解决思路:

数据库视图: vw_report_high_level_count ,两列: id 和 rowcount

module定义如下:

(注意:请确保有主键,以及定义各个字段类型即可,无需声明长度)

class ViewSampleView(db.Model):
    __tablename__ = 'vw_report_high_level_count'

    __table_args__ = {'info': dict(is_view=True)}

    id = db.Column(db.String(), primary_key=True)
    rowcount = db.Column(db.Integer(), nullable=False)

初次执行python3 manage.py db init命令·后·会在项目根目录下生成migrations文件夹。

在/migrations/env.py文件中添加如下内容,请务必确保run_migrations_offline() 和 run_migrations_online()的context.configure中都有添加include_object。

def include_object(object, name, type_, reflected, compare_to):
    """
    Exclude views from Alembic's consideration.
    """

    return not object.info.get('is_view', False)

...

context.configure(url=url,include_object = include_object)

修改完毕后,执行 python3 manage.py db migrate 命令将不再创建和数据库视图同名的table,后续python3 manage.py db upgrade也可以成功执行.

随后即可通过ViewSampleView.query.all()查询数据库视图的数据