Есть ли команда postgres для перечисления/удаления всех материализованных представлений?

Я создаю несколько представлений в моем коде, и каждый раз, когда выполняется код, я хотел бы удалить все материализованные представления, созданные до сих пор. Есть ли какая-либо команда, которая будет перечислять все материализованные представления для Postgres или удалить все из них?

Ответ 1

Показать все:

SELECT oid::regclass::text
FROM   pg_class
WHERE  relkind = 'm';

Имена автоматически экранируются и имеют соответствующую схему в соответствии с вашим текущим search_path, где это необходимо, в листинге от regclass до text.

Материализованные представления в системном каталоге pg_class обозначаются relkind = 'm'.
В документации:

m = materialized view

Чтобы удалить все, вы можете сгенерировать необходимый SQL script с помощью этого запроса:

SELECT 'DROP MATERIALIZED VIEW ' || string_agg(oid::regclass::text, ', ') 
FROM   pg_class
WHERE  relkind = 'm';

Возвращает:

DROP MATERIALIZED VIEW mv1, some_schema_not_in_search_path.mv2, ...

Один DROP MATERIALIZED VIEW оператор может позаботиться о нескольких материализованных представлениях. Возможно, вам придется добавить CASCADE в конец, если у вас есть вложенные представления.

Осмотрите полученный DDL script, прежде чем выполнять его. Вы уверены, что хотите удалить все MV из всех схем в db? (В настоящее время нет материализованных представлений в новой стандартной установке.)

Ответ 2

Это было бы проще, если вы хотите получить полный список с оператором DROP перед каждым представлением:

SELECT 'DROP MATERIALIZED VIEW ' || relname || ';' 
FROM   pg_class
WHERE  relkind = 'm';

Ответ 3

Этот ответ основан на ответе Erwin Brandstetter. В приведенной ниже версии добавляется конкретное имя схемы, чтобы извлекать только материализованные представления из определенной схемы. Cascasde также отбрасывает зависимости от материализованных представлений из этой схемы. Будьте осторожны с этим.

SELECT 'DROP MATERIALIZED VIEW <<schema_name>>.' || c.relname::text || ' CASCADE;' AS drop_statements
FROM pg_class c
INNER JOIN pg_namespace n ON n.oid = c.relnamespace
AND c.relkind = 'm'
AND n.nspname = '<<schema_name>>'