python - PostgreSQL 物化 View 未从 Python 刷新

标签 python postgresql pgadmin timescaledb

我在 TimescaleDB(时间序列数据的 PostgreSQL 扩展)中创建了一个物化 View ,当我使用 PGAdmin 的以下代码刷新它时,添加了最新的数据并且一切正常:

REFRESH MATERIALIZED VIEW CONCURRENTLY 
    public.time_series_mv
    WITH DATA;

当我在 Python 中使用相同的用户 (postgres) 运行完全相同的代码时,它表示成功(即没有发生错误)但是最新的数据实际上没有被添加到物化 View ...

因此我尝试创建一个函数来做同样的事情:

CREATE OR REPLACE FUNCTION refresh_time_series_mv()
    RETURNS void
    SECURITY DEFINER
    AS $$
    BEGIN
    REFRESH MATERIALIZED VIEW CONCURRENTLY time_series_mv with data;
    RETURN;
    END;
$$ LANGUAGE plpgsql;

然后我按如下方式运行该函数,同样,它在我的浏览器中通过 PGAdmin 运行,但当我在我的调度应用程序中从 Python 运行相同的 SQL 时,它却无法运行。

select refresh_time_series_mv();

这是我的 Python 代码:

import psycopg2

SQL1 = """
    REFRESH MATERIALIZED VIEW CONCURRENTLY 
    public.time_series_mv
    WITH DATA
"""

SQL2 = "select refresh_time_series_mv();"

host = os.getenv("HOST") 
port = int(os.getenv("PORT"))
dbname = os.getenv('DB')
user = os.getenv("USER")
password = os.getenv("PASS")

conn = psycopg2.connect(
    host=host, 
    port=port, 
    dbname=dbname, 
    user=user, 
    password=password, 
    connect_timeout=5
) 
cursor = conn.cursor()
cursor.execute(SQL1)
# cursor.execute(SQL2)
cursor.close()
conn.close()

无论我使用“SQL1”还是“SQL2”,Python 代码都成功运行(显然,对 Python 而言),但是同样,物化 View 中的数据没有刷新...

无论是在 PGAdmin 中还是在 Python 中,我都使用相同的用户名和密码连接到数据库。

有什么想法吗?谢谢! -肖恩

最佳答案

正如@jjanes 在 comment 中提到的那样,我需要在 cursor.execute(SQL) 之后添加以下内容:

conn.commit()

问题解决了。如果 conn.commit() 存在,我在问题中提到的任何一个 SQL 语句都会起作用。

关于python - PostgreSQL 物化 View 未从 Python 刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64019428/

相关文章:

pgadmin - 如何停止 pgadmin 4 进程?

python - 在pandas中加入2个具有不同列名的数据框

python - Pandas:将行中列的值设置为存储在其他行索引处的不同 df 中的值

SQL:使用同一个表中的最小值更新最大值

postgresql - 在事务中封装语句是否包括它触发的触发器?

postgresql - 如何禁用 postgresql "Cache"优化?

vb.net - 如何将 PostgreSQL 与 VB.NET 应用程序连接

python - Pandas:如果超过一半是 NaN,则删除行和列

python - 无法使用 Python 安装 Selenium WebDriver