有没有一种简单的方法可以轻松地获取查询结果的列类型?我读了psql文档,但我认为它不支持该功能。理想情况下,我希望能够获得类似于以下内容:
columna : text | columnb : integer
----------------+-------------------
oh hai | 42
我是否可以在不编写任何代码的情况下获取这些信息?
有没有一种简单的方法可以轻松地获取查询结果的列类型?我读了psql文档,但我认为它不支持该功能。理想情况下,我希望能够获得类似于以下内容:
columna : text | columnb : integer
----------------+-------------------
oh hai | 42
我是否可以在不编写任何代码的情况下获取这些信息?
可以获取任何 SELECT 查询结果列的类型。
示例
给定以下查询和结果,让我们回答问题“all_ids 的列类型是什么?”
SELECT array_agg(distinct "id") "all_ids" FROM "auth_user";
all_ids
--------------------------------------------
{30,461577687337538580,471090357619135524}
(1 row)
我们需要一种机制来揭示“all_ids”的类型。
在postgres邮件列表档案中,我找到了一个名为pg_typeof
的本地pg函数的参考。
使用示例:
SELECT pg_typeof(array_agg(distinct "id")) "all_ids" FROM "auth_user";
输出:
all_ids
----------
bigint[]
(1 row)
干杯!
使用\gdesc
命令(在PSQL 11中)确实是可能的:
显示当前查询缓冲区结果的描述(即列名和数据类型)。查询不会被实际执行;但是,如果它包含某种类型的语法错误,则该错误将按照正常方式报告。
如果当前的查询缓冲区为空,则会描述最近发送的查询。
例如:
$ SELECT * FROM pg_database \gdesc
COLUMN | TYPE
---------------+-----------
datname | name
datdba | oid
encoding | INTEGER
datcollate | name
datctype | name
datistemplate | BOOLEAN
datallowconn | BOOLEAN
datconnlimit | INTEGER
datlastsysoid | oid
datfrozenxid | xid
datminmxid | xid
dattablespace | oid
datacl | aclitem[]
psql
访问旧版的 PostgreSQL 服务器,例如 apt install postgresql-client-11
。 - Yuri Astrakhan我认为,除非您编写存储过程,否则无法完全打印示例中的内容。
一种方法是(两个“selects”):
create table my_table as select ...
\d my_table
select * from my_table
pg_typeof()
相比,这似乎有些笨拙和不方便。 - Jay Taylor
psql
可以直接向您展示它。 但是修改它应该相当容易。也许您可以编写一个存储过程来模拟这个功能。 - Wolph