Как мне узнать структуру базы данных PostgreSQL? - PullRequest
34 голосов
/ 24 февраля 2009

Мне нужно написать скрипт, который будет выводить данные из базы данных PostgreSQL, структуру которой я не знаю. Какой запрос вернет имена всех таблиц в базе данных? И какой запрос будет перечислять имена всех столбцов в таблице?

Ответы [ 7 ]

45 голосов
/ 29 мая 2012

Инструмент запросов к базе данных psql, входящий в состав дистрибутива PostgreSQL, предоставляет описание таблицы функциональность.

# psql postgres postgres
psql (9.1.0)
Type "help" for help.

postgres=# -- list all tables:
postgres=# \d
           List of relations
 Schema |   Name    | Type  |  Owner   
--------+-----------+-------+----------
 public | my_table  | table | postgres
 public | my_table2 | table | postgres
(2 rows)


postgres=# -- describe table:
postgres=# \d my_table
   Table "public.my_table"
 Column |  Type   | Modifiers 
--------+---------+-----------
 col1   | integer | 
 col2   | text    | 

Остальные команды psql , которые вы можете получить с помощью \?:

postgres=#   \?
General
  \copyright             show PostgreSQL usage and distribution terms
  \g [FILE] or ;         execute query (and send results to file or |pipe)
  \h [NAME]              help on syntax of SQL commands, * for all commands
  \q                     quit psql

Query Buffer
  \e [FILE] [LINE]       edit the query buffer (or file) with external editor
  \ef [FUNCNAME [LINE]]  edit function definition with external editor
  \p                     show the contents of the query buffer
  \r                     reset (clear) the query buffer
  \s [FILE]              display history or save it to file
  \w FILE                write query buffer to file

Input/Output
  \copy ...              perform SQL COPY with data stream to the client host
  \echo [STRING]         write string to standard output
  \i FILE                execute commands from file
  \o [FILE]              send all query results to file or |pipe
  \qecho [STRING]        write string to query output stream (see \o)

Informational
  (options: S = show system objects, + = additional detail)
  \d[S+]                 list tables, views, and sequences
  \d[S+]  NAME           describe table, view, sequence, or index
  \da[S]  [PATTERN]      list aggregates
  \db[+]  [PATTERN]      list tablespaces
  \dc[S]  [PATTERN]      list conversions
  \dC     [PATTERN]      list casts
  \dd[S]  [PATTERN]      show comments on objects
  \ddp    [PATTERN]      list default privileges
  \dD[S]  [PATTERN]      list domains
  \det[+] [PATTERN]      list foreign tables
  \des[+] [PATTERN]      list foreign servers
  \deu[+] [PATTERN]      list user mappings
  \dew[+] [PATTERN]      list foreign-data wrappers
  \df[antw][S+] [PATRN]  list [only agg/normal/trigger/window] functions
  \dF[+]  [PATTERN]      list text search configurations
  \dFd[+] [PATTERN]      list text search dictionaries
  \dFp[+] [PATTERN]      list text search parsers
  \dFt[+] [PATTERN]      list text search templates
  \dg[+]  [PATTERN]      list roles
  \di[S+] [PATTERN]      list indexes
  \dl                    list large objects, same as \lo_list
  \dL[S+] [PATTERN]      list procedural languages
  \dn[S+] [PATTERN]      list schemas
  \do[S]  [PATTERN]      list operators
  \dO[S+] [PATTERN]      list collations
  \dp     [PATTERN]      list table, view, and sequence access privileges
  \drds [PATRN1 [PATRN2]] list per-database role settings
  \ds[S+] [PATTERN]      list sequences
  \dt[S+] [PATTERN]      list tables
  \dT[S+] [PATTERN]      list data types
  \du[+]  [PATTERN]      list roles
  \dv[S+] [PATTERN]      list views
  \dE[S+] [PATTERN]      list foreign tables
  \dx[+]  [PATTERN]      list extensions
  \l[+]                  list all databases
  \sf[+] FUNCNAME        show a function's definition
  \z      [PATTERN]      same as \dp

Formatting
  \a                     toggle between unaligned and aligned output mode
  \C [STRING]            set table title, or unset if none
  \f [STRING]            show or set field separator for unaligned query output
  \H                     toggle HTML output mode (currently off)
  \pset NAME [VALUE]     set table output option
                         (NAME := {format|border|expanded|fieldsep|footer|null|
                         numericlocale|recordsep|tuples_only|title|tableattr|pager})
  \t [on|off]            show only rows (currently off)
  \T [STRING]            set HTML <table> tag attributes, or unset if none
  \x [on|off]            toggle expanded output (currently off)

Connection
  \c[onnect] [DBNAME|- USER|- HOST|- PORT|-]
                         connect to new database (currently "postgres")
  \encoding [ENCODING]   show or set client encoding
  \password [USERNAME]   securely change the password for a user
  \conninfo              display information about current connection

Operating System
  \cd [DIR]              change the current working directory
  \timing [on|off]       toggle timing of commands (currently off)
  \! [COMMAND]           execute command in shell or start interactive shell

Variables
  \prompt [TEXT] NAME    prompt user to set internal variable
  \set [NAME [VALUE]]    set internal variable, or list all if no parameters
  \unset NAME            unset (delete) internal variable

Large Objects
  \lo_export LOBOID FILE
  \lo_import FILE [COMMENT]
  \lo_list
  \lo_unlink LOBOID      large object operations
35 голосов
/ 24 февраля 2009
SELECT table_name 
    FROM information_schema.tables 
WHERE table_type = 'BASE TABLE' 
    AND table_schema NOT IN 
        ('pg_catalog', 'information_schema'); 

SELECT column_name 
    FROM information_schema.columns 
WHERE table_name = 'YourTablesName'; 

Эта страница содержит полезную информацию о получении информации из information_schema: http://www.alberton.info/postgresql_meta_info.html

5 голосов
/ 11 сентября 2014

Я знаю, что это 5 лет после запуска потока, но я хотел бы добавить небольшое изменение к решениям, предложенным до сих пор, на случай, если это поможет кому-то еще (в конечном счете, это то, что я должен был придумать ).

Потенциальная проблема, связанная с вышесказанным, заключается в том, что в случае наивного внедрения в базу данных с сотнями таблиц и тысячами полей разработчик может сначала запросить набор таблиц, а затем внутри цикла запросить все поля каждой таблицы. Это забивает сервер базы данных. Я знаю, что никто специально не предлагал использовать цикл, но никто также не предупреждал об этом. И, честно говоря, это своего рода неявно в том, как структурированы ответы, в том смысле, что они фактически говорят: «первый запрос ко всем таблицам, следующий запрос ко всем полям». В переводе на код этот процесс не может быть ничем иным, как циклом.

Лучший способ (imo) выполнить исходный вопрос - выполнить запрос, подобный:

SELECT table_schema, table_name, column_name 
    FROM information_schema.columns 
WHERE table_schema in ('a', 'b', 'c', 'd')

где a, b, c, d, ... - схемы с таблицами, которые вы хотите сформулировать.

Это предоставляет вам набор данных, который не нормализован, но это не имеет большого значения, так как вы все равно используете его с приложением - тривиально проанализировать результат на уровне приложения так, как вам нужно, и вы ' Мы попали на сервер базы данных только одним сверхлегким запросом, а не сотнями внутри цикла.

В любом случае, надеюсь, что это кому-нибудь поможет!

5 голосов
/ 24 февраля 2009

использовать представления ANSI information_schema

select * from information_schema.tables

select * from information_schema.columns
3 голосов
/ 24 февраля 2009

Если у вас есть доступ к psql , вы можете использовать \d и \d table. С точки зрения SQL первый эквивалентен

SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'

секунда

SELECT column_name FROM information_schema.columns WHERE table_name ='table'
1 голос
/ 03 января 2017
\d <table_name>

пример:

\d authors
0 голосов
/ 25 февраля 2009

Не пиши сам . Используйте phpPgAdmin - это будет намного проще, быстрее и менее подвержено ошибкам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...