alembic生成物化视图

时间:2016-04-26 04:35:54

标签: flask sqlalchemy flask-sqlalchemy alembic

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_viewrefresh_materialized_view方法直接来自博客文章。

请注意,上面的示例已经大大简化,并且由于我的简化, 可能看起来很愚蠢,但我想知道的真正想法是如何让alembic将此视图转换为一系列迁移期间的蒸馏操作

当我运行测试时,代码运行正常,视图生成正常,一切正常。当alembic运行时,它不会对视图执行任何操作。所以我最终要做的是将测试为物化视图发出的SQL复制到alembic迁移/版本文件中,然后直接执行该操作:

op.execute(activities_view_sql)

类似地,我在物化视图上生成唯一索引时执行相同的直接SQL执行。

不幸的是,我的方法容易出错,并且会造成看似不必要的代码重复。

有没有办法让alembic了解我的ActivityView以便随时更改,alembic会知道如何更新视图?

非常感谢!

0 个答案:

没有答案