Dokku + Postgres:如何刷新物化视图?
Dokku + Postgres : How to refresh a materialized view?
我正在使用 Dokku 和 dokku-postgres plugin
我正在寻找一种在 cron 作业中刷新实体化视图的方法。
我知道我能做到
dokku postgres:connect mydbinstance
连接到数据库,然后发出 REFRESH MATERIALIZED VIEW mymaterializedviewname
刷新我的视图。
但我正在寻找单个命令 (cron)。
我可以看到 here 该插件似乎不支持立即发出这样的命令。
我怎样才能做到这一点?
我找不到这样做的命令。我最终在 cron 中调用了一个 shell 脚本,它触发了一个 psql 函数。
定时任务表:
0 0 * * * /home/scripts/refreshMaterializedViews.sh
refreshMaterializedViews.sh :
echo 'select RefreshAllMaterializedViews();' | dokku postgres:connect my-postgres-db
其中 RefreshAllMaterializedViews() 是一个 psql 函数,用于一次刷新所有实体化视图。为了简单起见,我会在这里添加它,但它已经全部结束了 S.O.
Psql 函数:
CREATE OR REPLACE FUNCTION RefreshAllMaterializedViews(schema_arg TEXT DEFAULT 'public')
RETURNS INT AS $$
DECLARE
r RECORD;
BEGIN
RAISE NOTICE 'Refreshing materialized view in schema %', schema_arg;
FOR r IN SELECT matviewname FROM pg_matviews WHERE schemaname = schema_arg
LOOP
RAISE NOTICE 'Refreshing %.%', schema_arg, r.matviewname;
EXECUTE 'REFRESH MATERIALIZED VIEW ' || schema_arg || '.' || r.matviewname;
END LOOP;
RETURN 1;
END
$$ LANGUAGE plpgsql;
请注意,此函数不支持 'concurrently'。这意味着它将在刷新期间锁定您的物化视图。其他解决方案请参考this S.O question.
我正在使用 Dokku 和 dokku-postgres plugin
我正在寻找一种在 cron 作业中刷新实体化视图的方法。
我知道我能做到
dokku postgres:connect mydbinstance
连接到数据库,然后发出 REFRESH MATERIALIZED VIEW mymaterializedviewname
刷新我的视图。
但我正在寻找单个命令 (cron)。 我可以看到 here 该插件似乎不支持立即发出这样的命令。
我怎样才能做到这一点?
我找不到这样做的命令。我最终在 cron 中调用了一个 shell 脚本,它触发了一个 psql 函数。
定时任务表:
0 0 * * * /home/scripts/refreshMaterializedViews.sh
refreshMaterializedViews.sh :
echo 'select RefreshAllMaterializedViews();' | dokku postgres:connect my-postgres-db
其中 RefreshAllMaterializedViews() 是一个 psql 函数,用于一次刷新所有实体化视图。为了简单起见,我会在这里添加它,但它已经全部结束了 S.O.
Psql 函数:
CREATE OR REPLACE FUNCTION RefreshAllMaterializedViews(schema_arg TEXT DEFAULT 'public')
RETURNS INT AS $$
DECLARE
r RECORD;
BEGIN
RAISE NOTICE 'Refreshing materialized view in schema %', schema_arg;
FOR r IN SELECT matviewname FROM pg_matviews WHERE schemaname = schema_arg
LOOP
RAISE NOTICE 'Refreshing %.%', schema_arg, r.matviewname;
EXECUTE 'REFRESH MATERIALIZED VIEW ' || schema_arg || '.' || r.matviewname;
END LOOP;
RETURN 1;
END
$$ LANGUAGE plpgsql;
请注意,此函数不支持 'concurrently'。这意味着它将在刷新期间锁定您的物化视图。其他解决方案请参考this S.O question.