PostgreSQL实例化视图未从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,我都使用相同的用户名密码来连接数据库

有什么想法吗?谢谢! -Sean

解决方法

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

conn.commit()

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