PostgreSQL 物化视图未从 Python 刷新
PostgreSQL materialized view not refreshing from Python
我在 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。
有什么想法吗?谢谢!
-肖恩
正如@jjanes 在 中提到的,我需要在 cursor.execute(SQL) 之后添加以下内容:
conn.commit()
问题已解决。如果 conn.commit() 在那里,我在问题中提到的任何 SQL 语句都会起作用。
我在 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。
有什么想法吗?谢谢! -肖恩
正如@jjanes 在
conn.commit()
问题已解决。如果 conn.commit() 在那里,我在问题中提到的任何 SQL 语句都会起作用。