PostgreSQL物化视图未从Python刷新

2024-04-29 01:10:44 发布

您现在位置:Python中文网/ 问答频道 /正文

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

REFRESH MATERIALIZED VIEW CONCURRENTLY 
    public.time_series_mv
    WITH DATA;

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

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

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而言),但同样,数据不会在物化视图中刷新

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

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


Tags: 数据代码view视图timeosrefreshcursor
1条回答
网友
1楼 · 发布于 2024-04-29 01:10:44

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

conn.commit()

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

相关问题 更多 >