I know it seems dumb, but postgres really needs to add the simple developer experience stuff like:

SHOW CREATE TABLE;
SHOW TABLES;
SHOW DATABASES;
SHOW PROCESSLIST;

CockroachDB added these aliases ages ago.

如上是 Hacker News 今年 5 月的一个帖子,相信 PostgreSQL 的用户都知道,PostgreSQL has its own way!!!

是的,我们用 slash commands,并且热衷这种简洁的方式:

MySQL PG
show create table t; \d+ t
show tables; \d
show tables like "%test%" \dt public.*test*
show databases; \l
show processlist; SELECT * from pg_stat_activity;

不过 slash commands 只能在 psql 中使用,psql 将相应的命令转换成对应的 SQL 查询发送到 server 端处理。大多情况下,这种方式能满足用户的需求,但也有例外,比如:

  • 需要返回能够直接创建表的命令而非表结构
  • GUI tools / ORM

PG 生态如此强大,当然也有应对的方法,比如用 pg_dump 去获取创建表的语句,也有插件提供 UDF 供应用端调用(当然也可以自己写 UDF 来实现类似的功能):

但这依然不能覆盖所有的场景,例如,你总不能让 PgAdmin 这样的图形化工具去依赖外部插件提供的 UDF 吧?PgAdmin 同样是在应用端通过查询系统表来将其组装成需要的格式。

PG 有必要提供 SHOW CREATE TABLE 吗?

大多情况下,psql 的 slash commands 已经能够满足人们的需求,加之一些图形化工具有自己 hack 的方式,导致这个特性的优先级相对较低。

不过这个特性其实还是有用的,如果服务端提供了相应的查询语句,客户端就无需自行 hack 来解决问题,所以社区偶尔会出现 SHOW CREATE TABLE 相关的讨论:

不过有一些暂未明确的点:

  • 在客户端实现,还是在服务端实现?
  • 如果在客户端实现,是否考虑将 pg_dump 和 postgres_fdw 中的大量的冗余代码重构到 libpq 或 common 模块
  • 如果在 server 端实现,是以 udf 还是 SHOW CREATE TABEL 的方式提供

小结

psql、postgres_fdw 以及 pg_dump,都实现了获取表结构的能力,而且它们的实现都是在客户端,为了支持向后兼容,代码中还需要考虑不同的 PG 版本,并且存在大量冗余代码。个人观点:

  • SHOW CREATE TABLE 在 PG 中并不是伪需求,提供类似的功能后可以简化工具软件的开发工作
  • 支持在 server 侧,且以 UDF 的方式(pg_get_tabledef?)提供该特性
  • 如果你只是从 MySQL 数据库转到 PG,没必要等这个特性,建议尽快熟悉 Slash commands