TL; DR:我如何让sqmbic理解并为sqlalchemy中创建的物化视图生成SQL?
我使用flask-sqlalchemy并使用alembic和postgres。为了获得使用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运行时,它不会对视图执行任何操作。所以我最终要做的是将测试为物化视图发出的SQL复制到alembic迁移/版本文件中,然后直接执行该操作:
op.execute(activities_view_sql)
类似地,我在物化视图上生成唯一索引时执行相同的直接SQL执行。
不幸的是,我的方法容易出错,并且会造成看似不必要的代码重复。
有没有办法让alembic了解我的ActivityView
以便随时更改,alembic会知道如何更新视图?
非常感谢!