Существует ли запрос или команда PostgreSQL, которая возвращает имена полей и типы полей запроса, таблицы или представления?
Например, решение, если оно применяется к простому запросу SELECT, SELECT * from person
должно возвращать список вроде:
Column Name | Column Type
===========================
First Name | character
Last Name | character
Age | integer
Date of Birth | date
Я просмотрел information_schema
представления, описанные в ответе ниже, и, кажется, он достаточно хорошо охватывает таблицы, и я подозреваю, что он также охватывает и представления, но я еще не проверял это.
Последним является любой произвольный, но действительный запрос SELECT, например, включающий JOINS
и UNIONS
т. Д. В базу данных. Существует ли встроенная процедура или другая хранимая процедура или сценарий, которые могут возвращать то же самое для любого действительного запроса QUERY?
Я разрабатываю программу, которая создает данные и запрашивает формы, и эта информация необходима для проверки данных и выполнения функций для возвращаемых данных.
источник
SELECT
Е. Запросы, то есть запросы, не определяющие данные или манипулирующие данными, будь то таблицы, представления или другие запросы, возвращают строки и столбцы данных, поэтому PostgreSQL должен иметь возможность возвращать список имен столбцов и их типов данных. Представления,information_schema
упомянутые ниже в ответах, по-видимому, отвечают за таблицы и представления. Произвольные запросы SELECT являются последней границей. Я отредактирую ответ, чтобы объяснить лучшеОтветы:
Информационная схема и системные каталоги
Мы много раз обсуждали это. Информационная схема служит определенным целям. Если вы знакомы с системными каталогами, то они лучше всего подходят для большинства целей , IMO. Системные каталоги являются актуальным источником всей информации.
Информация схема обеспечивает стандартизированное мнение , которые помогают с мобильностью, в основном через крупную Postgres версию, потому что портативность на разные платформах RDBMS , как правило , является иллюзией , как только ваши запросы достаточно сложные для необходимости искать системные каталоги. И, в частности, Oracle все еще не поддерживает информационную схему.
Представления в информационной схеме должны перепрыгивать через множество циклов, чтобы получить формат, соответствующий стандарту. Это делает их медленными, иногда очень медленными. Сравните планы и производительность для этих основных объектов:
Разница замечательная. Это действительно зависит от того, что вы ищете.
Ваш пример
Для вашего примера
SELECT * from tbl
сравните два запроса ниже для этой простой таблицы:Использование
pg_attribute
:format_type()
возвращает полный тип со всеми модификаторами:Также обратите внимание, что приведение к
regclass
разрешает имя таблицы несколько разумно в соответствии с текущимsearch_path
. Это также вызывает исключение, если имя недействительно. Детали:Использование
information_schema.columns
:Информация стандартизирована, но неполна :
Чтобы получить полную информацию о типе данных, вам необходимо дополнительно рассмотреть все эти столбцы:
Связанные ответы:
Список плюсов и минусов , самые большие плюсы (ИМО) выделены жирным шрифтом:
Представления информационной схемы
Системные каталоги
oid
включены)Произвольный запрос
Чтобы получить тот же список имен и типов столбцов из запроса, вы можете использовать простой прием: СОЗДАЙТЕ временную таблицу из результатов запроса, а затем используйте те же методы, что и выше.
Вы можете добавить
LIMIT 0
, так как вам не нужны фактические данные:Чтобы получить тип данных отдельных столбцов, вы также можете использовать функцию
pg_typeof()
:источник
Вы можете использовать
psql
клиент командной строки.\dt
покажет список таблиц\dv
покажет список просмотров\d [object_name]
опишу схему таблицы или видаНе уверен, как бы вы описали запрос.
Дополнительная информация: https://manikandanmv.wordpress.com/tag/basic-psql-commands/
источник
Если у вас есть доступ к pg_catalog и вы используете PgAdmin3, я настоятельно рекомендую решение, которое я нашел в техническом блоге Валентина ( http://tech.valgog.com/2011/02/pgadmin-iii-macros-get-table-fields). HTML ). Это макрос PgAdmin3, к которому можно получить доступ с помощью ярлыка для отображения определения выбранного имени таблицы.
Работает как шарм и очень полезно.
источник
Используйте те
information_schema
взгляды , они SQL-стандарт и содержат информацию , которую вы хотите.Вы также можете получить прямой доступ
pg_class
иpg_attribute
т. Д., Но это непереносимо и часто неудобно; вам могут понадобиться вспомогательные функции, такие какoidvectortypes
,pg_get_function_arguments
и т. д. для некоторых вещей.Если вы хотите увидеть, как
psql
выполняется что-то вроде\dt
, запуститеpsql -E
- он напечатает запрос. Тем не менее, обычно лучше использовать,information_schema
если он будет соответствовать вашим потребностям.источник
Это может быть слишком просто, но pgAdmin4 показывает типы полей в выходных результатах. Другие решения выше, вероятно, более элегантны, но когда мне просто нужен быстрый ответ, я нахожу, что графический интерфейс запроса pgAdmin4 работает довольно хорошо. Попытка выяснить тип поля вычисляемого поля, возвращаемого представлением или функцией, может быть сложной.
источник