如何使Flask-Migrate忽略在Models定义的数据库视图
文章目录
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()查询数据库视图的数据
文章作者 honour
上次更新 2018-06-03