Надо было на днях посмотреть текст представления (VIEW). Использовал один способ, а потом подумал — какие еще есть варианты посмотреть этот текст? Поискал ответ, ниже напишу для себя и тех, кому интересно.
Для самых нетерпеливых — оглавление:
- Нулевой способ — с помощью psql: \sv
- Первый способ — с помощью psql: \d+
- Второй способ — с помощью psql: \ev
- Третий способ — функция pg_get_viewdef()
- Четвертый способ — запрос к системному каталогу
- Пятый способ — запрос к информационной схеме
Сначала создадим представление:
CREATE VIEW v_test AS SELECT n, random()*n n1 FROM generate_series(1,10) n;
И выполним запрос к созданному представлению. Получим понятный и очевидный результат:
postgres=# SELECT * FROM v_test; n | n1 ----+-------------------- 1 | 0.8934479984291848 2 | 0.4557215204640386 3 | 2.1148229362716116 4 | 2.0753327028436104 5 | 2.5119354289536666 6 | 2.1298602754709464 7 | 3.0742418640107196 8 | 0.7420296386879386 9 | 3.4679220774431947 10 | 8.192430288243173 (10 rows)
Можно несколько раз выполнить еще вот такой запрос:
postgres=# SELECT * FROM v_test WHERE n = 3;
Значение в поле n1 каждый раз будет разным. Фантастика!]
А теперь можно и текст представления посмотреть.
Нулевой способ — с помощью psql: \sv
Добавил этот способ уже после публикации, чтобы не менять нумерацию — задал ему нулевой индекс. Да и по простоте — этот способ самый лучший.
Итак, можно выполнить команду \sv и увидеть код представления прямо в выводе psql, а не в редакторе или где-либо еще. Ничего лишнего, простота:
postgres=# \sv v_test CREATE OR REPLACE VIEW public.v_test AS SELECT n.n, random() * n.n::double precision AS n1 FROM generate_series(0, 10) n(n)
Пожалуй именно этим способом и буду использовать если нужно только код представления посмотреть. А вот если нужен И код И еще что-то полезное — тогда давайте посмотрим и другие способы.
Первый способ — с помощью psql: \d+
Самый, мне кажется, простой способ — с помощью команды
postgres=# \d+ v_test View "public.v_test" Column | Type | Collation | Nullable | Default | Storage | Description --------+------------------+-----------+----------+---------+---------+------------- n | integer | | | | plain | n1 | double precision | | | | plain | View definition: SELECT n.n, random() * n.n::double precision AS n1 FROM generate_series(1, 10) n(n);
После перечня всех столбцов представления будет показан его текст. Но в нем есть некоторые отличия от оригинального. Но для понимания вьюшки его достаточно.
Второй способ — с помощью psql: \ev
Еще один способ, в котором используется psql.
Эта команда открывает текст представления в определенном редакторе.
Если вы еще не запускали команду \e — то появится диалог выбора редактора. Я уже запускал эту команду ранее, поэтому у меня код открывается в vim’e (редактор можно поменять).
А затем выполните команду:
\ev v_test
Откроется текст представления. У меня текст выглядит вот так:
Выглядит красиво, сразу с некоторой подсветкой синтаксиса.
Текст тоже может немного отличаться от того, который был указан в оригинальном тексте представления.
После выхода из редактор текст, который был в редакторе, выполнится (если поставить точку с запятой в psql’e), будьте аккуратны. И обратите внимание, что текст представления открывается начинаясь с CREATE OR REPLACE (первая строка), так что всё, что вы сохраните в редакторе — перетрет оригинальное представление.
Если ввести команду \ev без указания названия представления — тогда откроется редактор с заготовкой кода представления:
Про первый и второй способы можно прочитать в документации, в странице про интерактивный терминал psql.
Третий способ — функция pg_get_viewdef():
Существуют специальные функции обращения к системным каталогам, с помощью которых можно много чего узнать. В том числе — можно получить текст представления pg_get_viewdef():
postgres=# SELECT pg_get_viewdef('v_test'); pg_get_viewdef ------------------------------------------------ SELECT n.n, + (random() * (n.n)::double precision) AS n1+ FROM generate_series(0, 10) n(n); (1 row)
Передаем этой функции первым параметром название представления — и получаем результат, почти тот запрос, который мы написали при создании представления.
Четвертый способ — запрос к системному каталогу:
Можно обратиться к системному каталогу и запросом вытащить текст нужного представления. Для этого нужно запросить данные из системного представления pg_views:
postgres=# SELECT definition FROM pg_views WHERE viewname = 'v_test'; definition ------------------------------------------------ SELECT n.n, + (random() * (n.n)::double precision) AS n1+ FROM generate_series(0, 10) n(n); (1 row)
Очень похоже по выводу на предыдущий способ, не правда ли?
Можно получить чуть больше информации из этого представления:
postgres=# SELECT * FROM pg_views WHERE viewname = 'v_test' \gx -[ RECORD 1 ]---------------------------------------------- schemaname | public viewname | v_test viewowner | postgres definition | SELECT n.n, + | (random() * (n.n)::double precision) AS n1+ | FROM generate_series(0, 10) n(n);
Пятый способ — запрос к информационной схеме:
Есть еще один способ, он примерно аналогичен предыдущему. Можно обратиться к информационной схеме (information schema) и запросом вытащить текст нужного представления. Если кратко, в информационной схеме хранится информация о текущей базе данных, причем — это всё описано в стандарте SQL, поэтому можно в любой СУБД выполнить запрос к ней и получить стандартный результат. Только в ней не будет описания специфичных для PostgreSQL объектов (в отличии от системного каталога).
Обращаться нужно к представлению views:
postgres=# SELECT view_definition FROM information_schema.views where table_name = 'v_test'; view_definition ------------------------------------------------ SELECT n.n, + (random() * (n.n)::double precision) AS n1+ FROM generate_series(0, 10) n(n); (1 row)
И опять результат аналогичен предыдущему. Но столбцов в представлении information_schema.views больше:
postgres=# SELECT * FROM information_schema.views where table_name = 'v_test'\gx -[ RECORD 1 ]--------------+----------------------------------------------- table_catalog | postgres table_schema | public table_name | v_test view_definition | SELECT n.n, + | (random() * (n.n)::double precision) AS n1+ | FROM generate_series(0, 10) n(n); check_option | NONE is_updatable | NO is_insertable_into | NO is_trigger_updatable | NO is_trigger_deletable | NO is_trigger_insertable_into | NO
Вот такие есть способы посмотреть текст представления в PostgreSQL. Может быть и еще какие-нибудь имеются, если найду — добавлю их сюда.
Leave a Reply