PostgreSQL材料化视图从Python未刷新

3

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

REFRESH MATERIALIZED VIEW CONCURRENTLY 
    public.time_series_mv
    WITH DATA;

当我在Python中使用相同的用户(postgres)运行完全相同的代码时,它显示成功(即没有发生错误),但最新的数据实际上并没有被添加到物化视图中...
因此,我尝试创建一个函数来完成相同的事情:
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


3
Python默认情况下不会自动提交。看起来你也从未手动提交过。所以你的操作被回滚了。 - undefined
@jjanes 哎呀,我真是个愚蠢的错误。你说得对,问题解决了! - undefined
1个回答

10

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

conn.commit()

问题已解决。如果在conn.commit()处添加了语句,我在问题中提到的任一 SQL 语句都将起作用。

2
谢谢你帮我节省了时间! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接