PostgreSQLでrelation does not existが出たらどうする?


仕事でサイト移転の作業をしているのですが、その中で躓いたことを3件ほど記事にしようと思っています。その中の1件ですが、「テーブルが存在しているのにテーブルがない(relation “テーブル名” does not exist)と言われる」という件について書きます。

これ、調べても調べても出てくるのは「テーブル名に大文字小文字が混在していると出る」と言うもので、対策としては「呼び出すときのテーブル名をダブルクォーテーションで囲め」なんですが、今回の事例はテーブル名は全て小文字だったので該当しないんですね。で、悩みまくったのですがなんとか解決できました。

結論としては、テーブル名をスキーマ名を付けずに指定した時に検索されるパスの問題というものでした。

今回の事例を詳しく説明しますと、移転元のPostgreSQLでは「DB名:aaa、スキーマ名:aaa、ユーザー名:aaa」というものだったのですが、移転先ではPleskを使っている関係上なのか何故かDB名とユーザー名を同一にできなかったんですね。なので移行した際に「DB名:aaa、スキーマ名:aaa、ユーザー名:bbb」という感じになっていました。この状態でスキーマ名を付けずにテーブルを呼び出すと先の「relation “テーブル名” does not exist」というエラーになったのです。

かなり時間をかけて調査した結果、まずは検索パスを調べろという情報がありまして、調べてみました。

SHOW search_path;

すると、

"$user",public

と返ってきました。要するにユーザー名と同一の名前のスキーマ、もしくは、publicというスキーマを検索するということです。

対策としては、検索パスを書き換える

SET search_path TO スキーマ名;

か、スキーマ名そのものを変えてしまうということになります。今回は面倒なのでスキーマ名をphpPgAdminで書き換えてしまいました。

結果として「DB名:aaa、スキーマ名:bbb、ユーザー名:bbb」となって、エラーが出ずに動くようになりました。MySQLの場合は全然意識しないところだったので完全に嵌ってしまったのと、日本語サイトにはこの情報が皆無だったので記事にしました。お役に立てば幸いです。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です