Dokku + Postgres:如何刷新物化视图?

时间:2017-01-30 12:57:44

标签: postgresql cron dokku

我正在使用Dokku dokku-postgres plugin

我正在寻找一种在cron作业中刷新物化视图的方法。 我知道我能做到 dokku postgres:connect mydbinstance要连接到数据库,然后发出REFRESH MATERIALIZED VIEW mymaterializedviewname以刷新我的视图。

但我正在寻找一个命令(cron)。 我可以看到here该插件似乎不支持立即发出这样的命令。

我怎么能实现这个目标?

1 个答案:

答案 0 :(得分:1)

我无法找到这样做的命令。我最终在cron中调用了一个shell脚本,它触发了一个psql函数。

crontab:

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;

请注意,此功能并不同时支持'。这意味着它将在刷新期间锁定Materialized视图。有关其他解决方案,请参阅this S.O question.