2017-01-30 102 views
1

我正在使用Dokku和dokku-postgres pluginDokku + Postgres:如何刷新物化視圖?

我正在尋找一種方法來刷新cron作業中的物化視圖。 我知道我能做到 dokku postgres:connect mydbinstance連接到數據庫,然後發出REFRESH MATERIALIZED VIEW mymaterializedviewname有我的看法刷新。

但我正在尋找一個命令(cron)。 我可以看到here這個插件似乎不支持馬上發出這樣的命令。

我怎麼能做到這一點?

回答

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; 

請注意,此功能不支持 '同時'。這意味着它將在刷新期間鎖定實體化視圖。其他解決方案請參考this S.O question.