2017-01-30 2 views
1

Я использую Dokku с dokku-postgres pluginDokku + Postgres: Как обновить материализованный вид?

Я ищу способ обновить свои материализованные виды в работе cron. Я знаю, что могу сделать dokku postgres:connect mydbinstance, чтобы подключиться к БД, а затем выпустить REFRESH MATERIALIZED VIEW mymaterializedviewname, чтобы обновить мое представление.

Но я ищу одну команду (cron). Я мог видеть here, что плагин, похоже, не поддерживает выдачу такой команды сразу.

Как я мог достичь этого?

ответ

1

Я не мог найти команду для этого. Я закончил вызов сценария оболочки в cron, который запускает функцию psql.

кронтаб:

0 0 * * * /home/scripts/refreshMaterializedViews.sh 

refreshMaterializedViews.sh:

echo 'select RefreshAllMaterializedViews();' | dokku postgres:connect my-postgres-db 

Где RefreshAllMaterializedViews() является функцией Psql, чтобы обновить все материализованные представления сразу. Я добавлю его здесь для простоты, но это уже на всем протяжении С. О.

функция 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.

Смежные вопросы