如何发现PostgreSQL数据库的结构?

Lia*_*iam 37 postgresql

我需要编写一个脚本,从PostgreSQL数据库输出我不知道结构的数据.什么查询将返回数据库中所有表的名称?什么查询将列出表中所有列的名称?

nad*_*000 46

数据库查询工具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    | 
Run Code Online (Sandbox Code Playgroud)

你可以得到的其余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
Run Code Online (Sandbox Code Playgroud)

  • 如果你想一次看到整个数据库结构,在`psql`控制台中输入`\ d*`.这给出了该数据库中_all_表的模式. (3认同)

CTT*_*CTT 37

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'; 
Run Code Online (Sandbox Code Playgroud)

此页面提供了一些有关从information_schema检索信息的重要信息:http://www.alberton.info/postgresql_meta_info.html

  • 这不应该如此神秘。应该有一个命令:从“ your_table_name_here”中选择SELECT COLUMN_NAMES (2认同)

SQL*_*ace 5

使用ANSI information_schema视图

select * from information_schema.tables

select * from information_schema.columns
Run Code Online (Sandbox Code Playgroud)


Dav*_*vid 5

我知道这是在线程启动后的5年,但我想为目前为止提出的解决方案添加一些细微的变化,以防它帮助其他人(最终,这是我必须提出的).

上面的潜在问题是,如果对具有数百个表和数千个字段的数据库天真地实现,开发人员可能首先查询该组表,然后在循环内查询每个表的所有字段.这会破坏数据库服务器.我知道没有人特别建议使用循环,但没有人警告过它.坦率地说,它有点隐含在答案结构的方式中,因为它们有效地说"首先查询所有表,然后查询所有字段".转换为代码,该过程实际上不能是循环之外的任何东西.

完成原始问题的更好方法(imo)是运行如下查询:

SELECT table_schema, table_name, column_name 
    FROM information_schema.columns 
WHERE table_schema in ('a', 'b', 'c', 'd')
Run Code Online (Sandbox Code Playgroud)

其中a,b,c,d,...是表格中你需要清楚表达的模式.

这为您提供了一个未规范化的数据集,但这并不重要,因为您无论如何都要使用应用程序 - 在应用层以您需要的方式解析结果并且您只需点击它数据库服务器有一个超轻量级查询,而不是循环内的数百个.

无论如何,希望能帮助别人!