0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PostgreSQLのバックスラッシュコマンドの中身を知るのは-Eが便利

Posted at

はじめに

Qiitaに初投稿です。
小さい記事ですが、同じように気になってる方の一助になれば幸いです。

まず結論

psqlコマンドの-Eオプションを利用するとバックスラッシュコマンドのクエリが確認できます。

$psql -E 
tablename=# \d

きっかけ

最近業務でPythonからPostgreSQLを触る機会が増えてきました。
その際、利用しているライブラリは「psycopg2」ですが、1点困ったことが。

それは、PostgreSQLのバックスラッシュコマンドが使用できないことです。

例えば自作のテーブル名を知ることを目的に、「\d」を利用できれば、
以下の自作テーブルの一覧を取得できます。
しかし、それができません。

● リレーション一覧

スキーマ 名前 タイプ 所有者
public samples テーブル postgres
public samples_id_seq シーケンス postgres

タイプ: テーブルやシーケンスのテーブル名は以下のクエリでも取得できますが、
タイプの種類が増えた時は、都度クエリの追加が必要になります。

SELECT table_name FROM information_schema.tables WHERE table_schema='public';
SELECT sequence_name FROM information_schema.sequences WHERE sequence_schema = 'public';

やはりバックスラッシュコマンドを使用したいのが本音です。
これは何で構成されているのでしょうか?

Eオプションの存在を知る

ドキュメントを眺めていたところ、以下のオプションがあることに気が付きました。
公式ドキュメント

-E --echo-hidden
Echo the actual queries generated by \d and other backslash commands. You can use this to study psql's internal operations. This is equivalent to setting the variable ECHO_HIDDEN to on.

ドンピシャなことが書いていますね。
どうやら各バックスラッシュコマンドはクエリで定義されているようです。

実際にやってみましょう。

$psql -E -d <DB_NAME> -U postgres
<DB_NAME>=# \d

******** 問い合わせ ******
SELECT n.nspname as "Schema",
  c.relname as "Name",
  CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'm' THEN 'materialized view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 'f' THEN 'foreign table' WHEN 'p' THEN 'partitioned table' WHEN 'I' THEN 'partitioned index' END as "Type",
  pg_catalog.pg_get_userbyid(c.relowner) as "Owner"
FROM pg_catalog.pg_class c
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','p','v','m','S','f','')
      AND n.nspname <> 'pg_catalog'
      AND n.nspname <> 'information_schema'
      AND n.nspname !~ '^pg_toast'
  AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1,2;
**************************

期待するものが得られました!

これを利用することで、psycopg2を使用する上で困ったことが一つ減りそうです。
(あと凄くクエリの勉強にもなります)

最後に

初めて書いてみました。
今後も日ごろに疑問になって調べた内容を少しずつ上げていけるように頑張りたいと思います。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?