はじめに
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を使用する上で困ったことが一つ減りそうです。
(あと凄くクエリの勉強にもなります)
最後に
初めて書いてみました。
今後も日ごろに疑問になって調べた内容を少しずつ上げていけるように頑張りたいと思います。