【发布时间】:2016-08-19 17:10:21
【问题描述】:
TL;DR:我如何让 alembic 理解并为在 sqlalchemy 中创建的物化视图生成 SQL?
我正在使用flask-sqlalchemy,并且还使用带有postgres 的alembic。为了获得使用 sqlalchemy 的物化视图,我关注了该主题的 nice post。我大量使用了它,只是有一些小的分歧(本文也使用了flask-sqlalchemy,但是完整的代码示例直接使用了sqlalchemy的声明性基础)。
class ActivityView(db.Model):
__table__ = create_materialized_view(
'activity_view',
db.select([
Activity.id.label('id'),
Activity.name.label('name'),
Activity.start_date.label('start_date'),
]).where(
db.and_(
Activity.start_date != None,
Activity.start_date <=
datetime_to_str(datetime.now(tz=pytz.UTC) + timedelta(hours=48))
)
)
)
@classmethod
def refresh(cls, concurrently=True):
refresh_materialized_view(cls.__table__.fullname, concurrently)
db.Index('activity_view_index',
ActivityView.__table__.c.id, ActivityView.__table__.c.start_date,
unique=True)
create_materialized_view 和 refresh_materialized_view 方法直接取自博文。
请注意,上面的示例已被大大简化,并且由于我的简化可能看起来很傻,但我想要了解的真正想法是如何让 alembic 将此视图转换为一系列迁移期间的 alembic 操作?
当我运行测试时,代码运行良好,视图生成良好,一切正常。当 alembic 运行时,它不会对视图做任何事情。所以我最终要做的是将测试为物化视图发出的 SQL 复制到 alembic 迁移/版本文件中,并最终直接执行为:
op.execute(activities_view_sql)
同样,在物化视图上生成唯一索引时,我也会直接执行 SQL。
不幸的是,我的方法容易出错,并且会产生看似不必要的代码重复。
有没有办法让 alembic 了解我的 ActivityView,以便任何时候它发生变化,alembic 都会知道如何更新视图?
非常感谢!
【问题讨论】:
-
出于好奇,你有没有想过这个?从今天开始走这条路……
标签: python flask sqlalchemy flask-sqlalchemy alembic