Существующая таблица PostgreSQL не найдена: причины и решения
Быстрый ответ
Для исключения ошибки "relation does not exist" в PostgreSQL, проверьте чувствительность к регистру в названиях таблиц и установите параметр search_path следующей командой:
SET search_path TO ваша_схема;
Либо указывайте префикс с названием схемы при обращении к таблице:
SELECT * FROM ваша_схема.ваша_таблица;
Еще убедитесь, что у пользователя, выполняющего запрос, есть соответствующие права доступа.
Детали: чувствительность к регистру и выбор схемы
С PostgreSQL нужно остроумно обращаться с регистром названий. Помните, что PostgreSQL по умолчанию приводит идентификаторы, которые не заключены в кавычки, к нижнему регистру:
-- PostgreSQL чувствителен к регистру имена!
SELECT * FROM LIGHTbulb;
Если вы не указываете схему явно, PostgreSQL ищет таблицу в схеме public:
-- Если таблица находится в схеме public
SELECT * FROM ваша_таблица;
-- Если таблица находится в другой схеме
SELECT * FROM другая_схема.ваша_таблица;
-- Изменение search_path для текущей сессии
SET search_path TO другая_схема;
Разрешения и права доступа
Для эффективного взаимодействия каждому участнику сообщества необходимы соответствующие полномочия. Так и пользователю базы данных требуются определенные права на таблицу:
-- Проверяем, есть ли таблица в указанной схеме
SELECT table_schema, table_name
FROM information_schema.tables
WHERE table_name = 'ваша_таблица';
-- Проверяем права доступа пользователя
\dt ваша_схема.ваша_таблица
Если у пользователя не хватает прав на таблицу, можно исправить ситуацию следующим образом:
-- Предоставляем пользователю доступ к таблице
GRANT SELECT ON ваша_таблица TO ваш_пользователь;
Визуализация
Представьте, что поиск таблицы подобен поиску книги на полке:
База данных (📚): [Таблица_A, Таблица_B, Таблица_C]
Запрос (👀): SELECT * FROM таблица_d;
👀🔍📚: [❓]
# Ничего не найдено, так как "таблица_d" отсутствует на полке.
Для решения проблемы можно предпринять следующие шаги:
- Указать корректную схему: SET search_path TO нужная_схема;
- Правильно использовать кавычки: SELECT * FROM "Таблица_D";
- Удостовериться в существовании Таблицы_D: Действительно ли существует "Таблица_D"?
Важно помнить: Весь вопрос в нахождении в правильном месте, использовании верного наименования и в наличии необходимого доступа!
Особенности параметра search_path
Без установленного параметра search_path неоднозначные имена таблиц ускользнут от вас. Пройдитесь по текущему search_path:
SHOW search_path;
Чтобы задать search_path
для дальнейшего использования, выполните следующую команду:
ALTER ROLE ваш_пользователь SET search_path TO ваша_схема, public;
Использование схем: создайте свое собственное пространство
Создание собственной области (индивидуальной схемы) позволяет более эффективно управлять вашими данными:
-- Создаем личное пространство
CREATE SCHEMA private;
-- Устанавливаем правила использования
SET search_path TO private;
Схему public
лучше держать чистой от лишних объектов, чтобы снизить риск утечки данных.
Когда идентификаторы прячутся
Чувствительность к регистру в PostgreSQL может стать препятствием в попытках обнаружить идентификаторы:
-- Имя со смешным регистром (игра началась), требуется использование кавычек
SELECT * FROM "СмешанноРегистроваяТаблица";
Без применения кавычек вы всегда обращаетесь к таблице в нижнем регистру:
CREATE TABLE "ЧувствительнаяТаблица" ...
SELECT * FROM чувствительнаятаблица; -- Где же "ЧувствительнаяТаблица"? Нашли чемпиона в игре "Прытки"! 🏆
Обнаружение скрытого сокровища с использованием information_schema
Использование information_schema.columns
поможет вам отыскать скрытые колонки:
SELECT column_name
FROM information_schema.columns
WHERE table_name = 'ваша_таблица' AND table_schema = 'ваша_схема';
Этот способ оказывается полезным, когда столбец "играет вневидимку" у вас.
Полезные материалы
- PostgreSQL: Документация: Настройки клиента по умолчанию — навигация по штормящим водам настроек путей поиска
- PostgreSQL create table if not exists – Stack Overflow — советы сообщества по устранению ошибки 'relation does not exist'
- Postgres 12 | db<>fiddle — ваша песочница для экспериментов и изучения схем в PostgreSQL
- pgAdmin – PostgreSQL Tools — официальный инструмент для работы с объектами базы данных
- Чувствительность к регистру идентификаторов – PostgreSQL wiki — руководство по работе с чувствительностью к регистру идентификаторов в PostgreSQL.