【问题标题】:Dokku + Postgres : How to refresh a materialized view?Dokku + Postgres:如何刷新物化视图?
【发布时间】:2017-06-15 15:30:39
【问题描述】:

我正在使用 Dokku 和 dokku-postgres plugin

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

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

我怎样才能做到这一点?

【问题讨论】:

    标签: postgresql cron dokku


    【解决方案1】:

    我找不到执行此操作的命令。我最终在 cron 中调用了一个 shell 脚本,它触发了一个 psql 函数。

    crontab:

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

    刷新MaterializedViews.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.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 2012-07-18
      • 2015-10-10
      相关资源
      最近更新 更多