PostgreSQL Linux

PostgreSQL: ERROR — relation does not exist

  • Обновлено
  • Чтение ≈ 4 минуты

Краткий ответ

Таблица не найдена: она в другой схеме, имя набрано с другим регистром либо миграции не выполнены. Ниже — причины и порядок действий от простого к сложному.

В этой статье
  1. Что означает ошибка
  2. Причины и решения
  3. Пошаговое решение
  4. База и схема
  5. Регистр и кавычки
  6. Миграции и права

#Что означает ошибка

Сообщение
ERROR: relation "users" does not exist

ERROR: relation "users" does not exist в PostgreSQL означает, что таблица, представление или последовательность с таким именем не найдены в путях поиска схем. Причины: другая база или схема, регистр и кавычки в имени, миграции не выполнены.

PostgreSQL приводит неэкранированные имена к нижнему регистру.

Таблица "Users" и users — разные объекты.

Таблица не найдена: она в другой схеме, имя набрано с другим регистром либо миграции не выполнены. Проверьте схему (search_path) и регистр имён.

#Причины и решения

Возможная причинаКак узнатьЧто делать
Таблица в другой схемеОбъект находится в схеме, отсутствующей в search_pathУкажите явное имя schema.table либо исправьте согласованный search_path.
Регистр имениИмя создано в кавычках с заглавными буквамиИспользуйте точный регистр и кавычки; не переименовывайте объект вслепую.
Не выполнены миграцииТаблица отсутствует в нужной базе и миграции не применялисьПроверить историю миграций, затем применить на тестовой копии.
Подключение не к той базеcurrent_database() отличается от базы приложенияИсправьте строку подключения, не создавайте новую таблицу в чужой базе.

#Пошаговое решение

  1. Проверьте текущую базу и схемуОткройте SQL-клиент именно для приложения, где ошибка (psql, pgAdmin или IDE) и сначала выполните SELECT current_database(), current_schema(), current_user; SHOW search_path;. Сверьте имя базы, пользовательскую роль и окружение с настройками подключения приложения (тест/разработка/рабочая база). relation does not exist может относиться не только к таблице, но и к представлению, индексу или последовательности. Не создавайте новую таблицу до выяснения, куда направлен запрос.
  2. Найдите таблицу в information_schemaВ psql выполните \dt *.* для видимых таблиц либо SQL SELECT table_schema, table_name FROM information_schema.tables WHERE table_name ILIKE '%users%' ORDER BY 1,2;, заменив users на часть имени. Если объект нашёлся в схеме, отличной от ожидаемой, в запросе укажите schema.table или исправьте согласованную настройку search_path; глобально менять search_path в рабочей базе без проверки опасно. Если объект не найден, убедитесь, что у роли есть доступ и что вы в нужной базе.
  3. Проверьте регистр и кавычкиЕсли объект создан в кавычках с заглавными буквами (например, CREATE TABLE "Users"), обращаться к нему нужно с теми же кавычками и регистром: SELECT * FROM public."Users" LIMIT 1;. Не путайте это с обычным users: PostgreSQL приводит некавыченные идентификаторы к нижнему регистру. Не переименовывайте таблицу в рабочей базе сразу: это может нарушить существующие запросы и внешние зависимости.
  4. Выполните миграцииЕсли в верной базе таблицы действительно нет, проверьте журнал развёртывания и применённых миграций своего проекта (Django showmigrations, Alembic current, Laravel migrate:status — используйте только подходящий инструмент). Сначала проверьте резервную копию и актуальную схему, выполните миграцию на тестовой базе, затем по согласованию на рабочей. Не создавайте таблицы вручную «на глаз» и не запускайте миграции в чужой базе.
  5. Проверьте права на схему и таблицуЕсли таблица обнаружена, но доступ не подтверждён, от имени той же роли запустите SELECT * FROM schema.table LIMIT 1;, подставив точные имена. permission denied for schema или permission denied for table — другая ошибка: администратор может проверить \dp schema.table и выдать минимально необходимые USAGE на схему и SELECT/INSERT только по потребности. Повторите исходный запрос в приложении; при сохранении ошибки зафиксируйте SQL, подключённую базу и пользователя.
  6. SQL на просмотр в фактической базе приложения; %users% замените на имя своей таблицы
    Linux · Терминал (Bash)Команда
    SQL на просмотр в фактической базе приложения; %users% замените на имя своей таблицы.
    SELECT current_database(), current_schema(), current_user;
    SHOW search_path;
    SELECT table_schema, table_name FROM information_schema.tables WHERE table_name ILIKE '%users%';

#База и схема

Проверьте, что подключились к нужной базе: SELECT current_database(), current_schema();. В psql: \c имя_базы, \dt *.* или \dt public.*. Поиск таблицы: SELECT table_schema, table_name FROM information_schema.tables WHERE table_name ILIKE '%users%';. Если таблица в другой схеме, укажите schema.users или настройте SET search_path TO myschema, public;.

#Регистр и кавычки

Если таблица создана как "Users" (в кавычках), обращаться нужно только так: SELECT * FROM "Users";. Для ORM проверьте имя таблицы в модели (Django db_table, Sequelize tableName, Prisma @@map). Лучше использовать нижний регистр без кавычек. Проверьте опечатки и множественное число.

#Миграции и права

Миграции выполняйте только для правильной базы и конкретного проекта, изучив текущее состояние схемы и создав резервную копию. Примеры команд фреймворков — альтернативы, их нельзя запускать подряд. Если объект существует, но доступ запрещён, администратор предоставляет минимальные права на конкретную схему и таблицу, а не GRANT SELECT ON ALL TABLES всем приложением.

SQLКоманда
Альтернативное место просмотра: запросы только на чтение, без GRANT и без миграций.
SELECT current_database(), current_schema(), current_user;
SHOW search_path;
SELECT table_schema, table_name FROM information_schema.tables WHERE table_name ILIKE '%users%';

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 1 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.