2017/12/07
PostgreSQLにおいて、とあるスキーマに属しているテーブルを検索する際に、テーブルの前にスキーマを指定して検索を行うことができます。ですが、サーチパス(検索パス)を適切に設定することでスキーマの指定を省略することができます。
sponsored link
サーチパス(検索パス)とは
サーチパス(検索パス)とは、検索するスキーマのリストです。
スキーマが明示的に指定されなかった場合に使用され、サーチパスに従ってどのテーブルを指しているのかを判別します。
サーチパスで最初に一致したテーブルが、該当テーブルだと解釈します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
-- スキーマ:schema1 -- テーブル:test_table -- スキーマ名を指定 SELECT COUNT(*) FROM schema1.test_table; count ------- 3 -- スキーマ名を指定なし(サーチパス内にschema1がある場合) SELECT COUNT(*) FROM test_table; count ------- 3 -- スキーマ名を指定なし(サーチパス内にschema1がない場合) SELECT COUNT(*) FROM test_table; ERROR: relation "test_table" does not exist LINE 1: SELECT COUNT(*) FROM test_table; |
デフォルトの設定
サーチパスのデフォルト設定は、①接続したユーザーと同名のスキーマ ②publicスキーマ となっています。
確認方法
現在のサーチパスを確認するには、psqlでDBに接続し【SHOW search_path;】を使用します。
1 2 3 4 5 |
SHOW search_path; search_path -------------- "$user",public |
※カンマ区切りで指定、先頭の方が優先度が高い
※”$user”は、接続したユーザーと同名のスキーマの意味
設定方法
サーチパスをデフォルトから変更するには以下の3つの設定方法があります。
全ユーザーで永続的に設定
全ユーザーで永続的に設定するには、PostgreSQLの設定ファイルであるpostgresql.confを編集します。
デフォルトで以下となっていますので、先頭のコメントの#を消し、設定したい値に編集します。
1 |
#search_path = '"$user", public' |
※カンマ区切りで指定、先頭の方が優先度が高い
※”$user”は、接続したユーザーと同名のスキーマの意味
その後、設定を反映するためにPostgreSQLをリロードします。
1 |
pg_ctl reload |
特定ユーザーで永続的に設定
特定ユーザーで永続的に設定するには、psqlでDBに接続しALTERを使用します。
1 2 3 4 |
ALTER USER ユーザー名 SET search_path TO サーチパス; -- 使用例 ALTER USER user1 SET search_path TO "$user",schema1,public; |
※接続中のpsqlでは有効にはならないので再ログインが必要
一時的に設定
一時的にpsqlのセッション内でだけで設定するには、【SET search_path TO サーチパス;】を使用します。
1 2 3 4 |
SET search_path TO サーチパス; -- 使用例 SET search_path TO "$user",schema1,public; |
注意点
同名のテーブル
同名のテーブルが複数のスキーマに存在する場合、サーチパスを把握しておかないと、どのテーブルにアクセスしているのか混乱します。
1 2 3 4 5 6 7 8 9 |
-- schema1.test_table データは1件格納されている -- schema2.test_table データは2件格納されている -- サーチパスはschema1,schema2 SELECT COUNT(*) FROM test_table; count ------- 1 ← 優先度が高いschema1のtest_tableにアクセスしている |
最後に
サーチパスを適切に設定することで毎回スキーマを指定する煩雑さから解放されます。また、アプリケーションの中ではスキーマを記述しないことも多いのです。
ぜひ、おさえておきましょう。