我正在数据库中寻找我不知道的精确信息。数据库在单独的机器上,但我可以登录到它,并psql
以管理员权限启动命令行。
这是第三方产品,他们回答问题的速度很慢。我知道数据在那个数据库中,所以我想做一些逆向工程。
给定一个表名,是否可以获得该表中列名的列表?
例如,在 SQL Server 中,可以将表转储到可重用的CREATE
语句中,该语句以文本形式列出组成该表的所有列。
我正在数据库中寻找我不知道的精确信息。数据库在单独的机器上,但我可以登录到它,并psql
以管理员权限启动命令行。
这是第三方产品,他们回答问题的速度很慢。我知道数据在那个数据库中,所以我想做一些逆向工程。
给定一个表名,是否可以获得该表中列名的列表?
例如,在 SQL Server 中,可以将表转储到可重用的CREATE
语句中,该语句以文本形式列出组成该表的所有列。
除了
\d+ <table_name>
您已经找到的命令行之外,您还可以使用Information Schema来查找列数据,使用information_schema.columns
:注意:根据上面的示例,请确保将值括在引号内。
作为其他答案的补充,即使是不返回任何行的 SELECT 语句也会向您和应用程序代码公开列名。
我打算让几乎所有 DBMS 的几乎所有客户端软件都可以执行此操作。(几乎?是的,有些不支持像这样的子句
where false
。相反,它们需要像这样的表达式where 1 = 0
。)权限可能会与这些方法中的任何一种一起发挥作用。
信息模式是一种缓慢而可靠的方式:它是标准化的,并且很大程度上可移植到支持它的其他数据库。它将继续在主要版本中工作。
但是,信息模式中的视图通常会连接系统目录中的许多表以满足严格标准化的格式——其中许多大部分时间只是空运。这让他们变慢了。
Postgres 开发人员没有做出承诺,但基础知识(比如这里需要什么)不会在主要版本之间发生变化。
更详细的评估:
psql
(本机命令行界面)当然走快车道,直接查询源代码。如果psql
以参数-E
\d
开头,则会显示反斜杠命令后面的 SQL 。或者\set ECHO_HIDDEN on
从 psql 命令行。从那里开始,您可以为您的问题建立答案。比查询
information_schema.columns
更快。试着EXPLAIN ANALYZE
亲眼看看。对于一次性查找来说仍然无关紧要。但是如果在重复多次的查询/函数中使用可能会有所不同。可见度也有细微差别。详细对比:
psql
在 PostgreSQL 11+如果您正在查找查询中的列类型,您可以使用
psql
's\gdesc
仅限 PostgreSQL
这有点做作,但如果您正在寻找最短的 SQL,这可能是一个竞争者:
甚至更短(假设表中至少存在一行)
列表保留顺序。如果您不关心订单并
hstore
安装了扩展程序,您可以做得更短