postgresqlのスキーマでハマった

search_pathのデフォルトは?

hoge_db=# SHOW search_path;
 search_path  
--------------
 $user,public
(1 row)

作成したテーブルはデフォルトでどのスキーマに所属するのか?

hoge_db=# CREATE TABLE hoge_table (id integer,data text);
CREATE TABLE
hoge_db=# \dp
     Access privileges for database "hoge_db"
  Schema  |    Name    | Type  | Access privileges 
----------+------------+-------+-------------------
 postgres | hoge_table | table | 
(1 row)

データベースを所有するユーザ名のスキーマに所属します。

スキーマpublicとして、先程作成したテーブルを作成する

hoge_db=# CREATE TABLE public.hoge_table (id integer,data text);
CREATE TABLE

で、ここでハマった。

今まで作成したテーブルの一覧を表示してみる。

hoge_db=# \dp
     Access privileges for database "hoge_db"
  Schema  |    Name    | Type  | Access privileges 
----------+------------+-------+-------------------
 postgres | hoge_table | table | 
(1 row)

あれ………、スキーマpublicのテーブルが表示されない………。
なぜ???

どうやら、

search_pathで最初に記述している$user(postgres)で、
hoge_tableが見つかったので、表示させるのを止めたみたいです。

そのため、search_pathの順番を以下のように変更させ、
リストを表示させるとスキーマpublicのほうが表示される。

hoge_db=# SET search_path TO public,postgres;
SET
hoge_db=# \dp
    Access privileges for database "hoge_db"
 Schema |    Name    | Type  | Access privileges 
--------+------------+-------+-------------------
 public | hoge_table | table | 

ちなみに以下のように

正規表現を用いて、スキーマを指定すると、両方共に表示してくれる。

hoge_db=# \dp (public|postgres).
     Access privileges for database "hoge_db"
  Schema  |    Name    | Type  | Access privileges 
----------+------------+-------+-------------------
 postgres | hoge_table | table | 
 public   | hoge_table | table |