使用 SQLAlchemy 刷新物化视图

Posted

技术标签:

【中文标题】使用 SQLAlchemy 刷新物化视图【英文标题】:Refreshing a materialized view with SQLAlchemy 【发布时间】:2022-01-15 01:06:45 【问题描述】:

我有以下设置:

Postgres

在 Postgres (Aurora) 中,我设置了一个物化视图。由于只允许视图的所有者刷新它,因此我还创建了以下函数以允许其他用户刷新它:

CREATE OR REPLACE FUNCTION refresh_views()
    RETURNS void
    SECURITY DEFINER
AS
$$
BEGIN
    REFRESH MATERIALIZED VIEW my_schema.my_view with data;
    RETURN;
END;
$$ LANGUAGE plpgsql;

当我转到 SQL 终端并运行以下行时,视图会按预期刷新:

SELECT refresh_views();

Python

我们将 Python 与 SQLAlchemy/Pandas 一起使用,并且在大多数情况下运行良好。但是,我似乎无法从 Python 中正常工作。下面的两个版本都可以正常运行,并且花费的时间大致相同(约 1 分钟),但之后视图不会更新。

cxn.execute(text("SELECT refresh_views();"))
pd.read_sql(text("SELECT refresh_views();"), cxn)

知道为什么这不起作用吗?

【问题讨论】:

【参考方案1】:

您应该在连接结束时调用 commit。命令 SQL 终端处于autcommit=True 模式,而会话默认为autocommit=False

这篇文章是关于你的问题:PostgreSQL materialized view not refreshing from Python

【讨论】:

谢谢,成功了!我觉得这很奇怪,因为其他语句(DDL 和更新命令)工作得很好......

以上是关于使用 SQLAlchemy 刷新物化视图的主要内容,如果未能解决你的问题,请参考以下文章

[转]物化视图创建 及 刷新机制修改

如何获得oracle物化视图 定时刷新时 刷新所用的时间 或者是监控 物化视图在jobs中建立的job任务的执行时间

PG 物化视图

物化视图 - 识别最后一次刷新

并发刷新物化视图

刷新物化视图:并发、事务行为