如何在postgresql中从\ d中检索列名和数据类型

时间:2017-10-31 13:22:34

标签: postgresql

我是Postgresql的新手,正在开发一个关系快照的项目。我想从postgresql中的\ d +命令中检索前2列名和数据类型,然后使用这个结果创建另一个只有前2个的表柱 我坚持这个。有人可以指导我吗?

Column    |            Type             |                         Modifiers                          | Storage  | Stats target | Description 
--------------+-----------------------------+------------------------------------------------------------+----------+--------------+-------------
 i            | integer                     |                                                            | plain    |              | 
 updated_time | timestamp without time zone | default '2000-01-01 00:00:00'::timestamp without time zone | plain    |              | 
 version      | numeric                     | default '0'::numeric                                       | main     |              | 
 is_updated   | boolean                     | default false                                              | plain    |              | 
 name         | character varying(20)       |                                                            | extended |              | 

1 个答案:

答案 0 :(得分:0)

我会在这里使用plPgSql,例如:

t=# do
$$
begin
execute format('create table so as select %s from pg_database',(select string_agg(column_name,',') from information_schema.columns where table_name = 'pg_database' and ordinal_position <=2));
end;
$$
;
DO
t=# \d so
     Table "public.so"
 Column  | Type | Modifiers
---------+------+-----------
 datname | name |
 datdba  | oid  |

t=# \d pg_database
    Table "pg_catalog.pg_database"
    Column     |   Type    | Modifiers
---------------+-----------+-----------
 datname       | name      | not null
 datdba        | oid       | not null
 encoding      | integer   | not null
 datcollate    | name      | not null
 datctype      | name      | not null
 datistemplate | boolean   | not null
 datallowconn  | boolean   | not null
 datconnlimit  | integer   | not null
 datlastsysoid | oid       | not null
 datfrozenxid  | xid       | not null
 datminmxid    | xid       | not null
 dattablespace | oid       | not null
 datacl        | aclitem[] |
Indexes:
    "pg_database_datname_index" UNIQUE, btree (datname), tablespace "pg_global"
    "pg_database_oid_index" UNIQUE, btree (oid), tablespace "pg_global"
Tablespace: "pg_global"

<强>更新

如果需要,上述内容可以轻松修改其他选项,例如:

t=# drop table so;
DROP TABLE
t=# do
$$
begin
execute format('create table so (%s) ',(select string_agg(column_name||' '||data_type||' '||case when is_nullable = 'NO' then 'NOT NULL' else '' end,',') from information_schema.columns where table_name = 'pg_database' and ordinal_position <=2));
end;
$$
;
DO
t=# \d so
     Table "public.so"
 Column  | Type | Modifiers
---------+------+-----------
 datname | name | not null
 datdba  | oid  | not null

包含一些修饰符......

<强> UPDATE2

最后,如果您想使用\d元命令的确切结果 - 您可以使用psql \d使用的查询来构建dinamic查询:

-bash-4.2$ psql -E -c "\d pg_database"
********* QUERY **********
SELECT c.oid,
  n.nspname,
...

等等