psqlで\dコマンドが使えない場合の対処法

\d コマンドは、PostgreSQLのテーブルの情報を確認するためのpsqlのコマンドである。しかし、環境によっては実行時に以下のようなエラーが出て失敗してしまうことがある。relhasoids はそもそもテーブルに存在しないはずのカラムだったため、原因について調べてみた。

postgres=> \d table_name
ERROR:  column c.relhasoids does not exist
LINE 1: ...riggers, c.relrowsecurity, c.relforcerowsecurity, c.relhasoi...

原因

サーバ側のPostgreSQLのバージョンと、クライアント側のpsqlのバージョンが違っている場合に発生することがある。
上記のエラーで does not exist と言われているカラム relhasoids は、PostgreSQLのシステムカタログ*1に存在するカラムであり、バージョン11までは存在していたが、バージョン12からは削除されている。

今回の場合はサーバ側のバージョンが13、クライアント側のバージョンが11であったため、psqlrelhasoids を参照しようとしてエラーとなった。

psqlソースコードを確認すると、バージョンごとに \d で利用される実装が細かく分かれており、PostgreSQLのシステムカタログの実装の変更に合わせていることが分かる。

対処法

基本的にはクライアント側のpsqlのバージョンを、サーバ側のPostgreSQLのバージョンと合わせることで解消するしかない。
ただ、どんなカラムがあるかを確認するだけであれば、SELECT * FROM table_name で全カラム取得すれば事足りる。

どうしても\dコマンドと同じ情報を取得したいのであれば、サーバ側のバージョンに対応するpsqlで実装されているSQLを実行すればよいということになるが、おそらくそこまでするよりは、上述のpsqlのバージョンアップかSELECTのどちらかで対応するのが良いかと思われる。

参考サイト

*1:リレーショナルデータベース管理システムにおいて、テーブルや列の情報などのスキーマメタデータと内部的な情報を格納する場所