Как посмотреть код представления в PostgreSQL

PostgreSQLНадо было на днях посмотреть текст представления (VIEW). Использовал один способ, а потом подумал — какие еще есть варианты посмотреть этот текст? Поискал ответ, ниже напишу для себя и тех, кому интересно.

Для самых нетерпеливых — оглавление:

Сначала создадим представление:

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

Откроется текст представления. У меня текст выглядит вот так:

ev

Выглядит красиво, сразу с некоторой подсветкой синтаксиса.

Текст тоже может немного отличаться от того, который был указан в оригинальном тексте представления.

После выхода из редактор текст, который был в редакторе, выполнится (если поставить точку с запятой в psql’e), будьте аккуратны. И обратите внимание, что текст представления открывается начинаясь с CREATE OR REPLACE (первая строка), так что всё, что вы сохраните в редакторе — перетрет оригинальное представление.

Если ввести команду \ev без указания названия представления — тогда откроется редактор с заготовкой кода представления:

ev empty

Про первый и второй способы можно прочитать в документации, в странице про интерактивный терминал 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. Может быть и еще какие-нибудь имеются, если найду — добавлю их сюда.


Be the first to comment

Leave a Reply

Ваш Mail не будет опубликован.


*