Таблицы Postgresql существуют, но при запросе появляется сообщение «отношение не существует»


87

У меня есть база данных postgresql с несколькими таблицами. Если я запрошу:

SELECT column_name
FROM information_schema.columns
WHERE table_name="my_table";

Я получу список столбцов, возвращенных правильно.

Однако когда я спрашиваю:

SELECT *
FROM "my_table";

Я получаю сообщение об ошибке:

(ProgrammingError) relation "my_table" does not exist
'SELECT *\n    FROM "my_table"\n' {}

Есть мысли о том, почему я могу получить столбцы, но не могу запросить таблицу? Цель состоит в том, чтобы иметь возможность запрашивать таблицу.


можно сделать то же самое с другим столом? попробуйте создать новый.
Хуан Карлос Оропеза,

2
Показанный вами запрос не работает. WHERE table_name="my_table";является недопустимым, поскольку "my_table"ссылается на имя столбца, а такого столбца нет в information_schema.columns. Пожалуйста , измените свой вопрос и добавить точное create table заявление , использованные для создания таблицы.
a_horse_with_no_name

Ответы:


97

Вы должны включить схему, если она не является общедоступной

SELECT *
FROM <schema>."my_table"

Или вы можете изменить схему по умолчанию

SHOW search_path;
SET search_path TO my_schema;

Проверьте схему своей таблицы здесь

SELECT *
FROM information_schema.columns

введите описание изображения здесь

Например, если таблица находится в схеме по умолчанию, publicэто будет работать нормально.

SELECT * FROM parroquias_region
SELECT * FROM public.parroquias_region

Но для секторов нужно указать схему

SELECT * FROM map_update.sectores_point

3
Правильный ответ. Если вы не знакомы с иерархией в стандарте SQL «Кластер> Каталог> Схема> Таблица», см. Вопрос «В чем разница между каталогом и схемой в реляционной базе данных?» и моя диаграмма .
Basil Bourque

Ага, спасибо большое. Конечно, теперь я получаю permission denied, но, по крайней мере, я знаю, куда идти.
patkil

5
Для будущих читателей этого потока эта ошибка также может возникнуть, как и в моем случае, когда имя схемы и имя таблицы имеют символы смешанного регистра и не заключены по отдельности в двойные кавычки. Другими словами, они должны быть указаны как: "my_Schema". "My_Table"
Snidhi Sofpro

1
@SnidhiSofpro Что ж, это также происходит с именами полей. Мое предложение просто используйте имена в нижнем регистре, чтобы вам не нужно было добавлять двойные кавычки.
Хуан Карлос Оропеза

1
Что, если SET search_path TO my_schema;в оболочке postgres все работает, но в коде Python все работает не так ? У меня нет проблем с чувствительностью к регистру. Я уверен!
Alex Jolig

24

Ты можешь попробовать:

SELECT * 
FROM public."my_table"

Не забывайте двойные кавычки рядом с my_table.


3
У меня сработало добавление двойных кавычек к имени таблицы. Благодарю.
iAkshay

12

Пришлось заключить имя таблицы в двойные кавычки.

db=> \d
                           List of relations
 Schema |                     Name                      | Type  | Owner 
--------+-----------------------------------------------+-------+-------
 public | COMMONDATA_NWCG_AGENCIES                      | table | dan
 ...

db=> \d COMMONDATA_NWCG_AGENCIES
Did not find any relation named "COMMONDATA_NWCG_AGENCIES".

???

Двойные кавычки:

db=> \d "COMMONDATA_NWCG_AGENCIES"
                         Table "public.COMMONDATA_NWCG_AGENCIES"
          Column          |            Type             | Collation | Nullable | Default 
--------------------------+-----------------------------+-----------+----------+---------
 ID                       | integer                     |           | not null | 
 ...

Много-много двойных кавычек:

db=> select ID from COMMONDATA_NWCG_AGENCIES limit 1;
ERROR:  relation "commondata_nwcg_agencies" does not exist
LINE 1: select ID from COMMONDATA_NWCG_AGENCIES limit 1;
                       ^
db=> select ID from "COMMONDATA_NWCG_AGENCIES" limit 1;
ERROR:  column "id" does not exist
LINE 1: select ID from "COMMONDATA_NWCG_AGENCIES" limit 1;
               ^
db=> select "ID" from "COMMONDATA_NWCG_AGENCIES" limit 1;
 ID 
----
  1
(1 row)

Это postgres 11. Операторы CREATE TABLE из этого дампа также имеют двойные кавычки:

DROP TABLE IF EXISTS "COMMONDATA_NWCG_AGENCIES";

CREATE TABLE "COMMONDATA_NWCG_AGENCIES" (
...

4
Postgres по умолчанию конвертирует все в нижний регистр, если, конечно, не используются двойные кавычки.
Арпит Сингх

3

У меня была та же проблема, которая возникла после восстановления данных из db, сброшенного postgres.

В моем файле дампа была команда ниже, откуда все пошло на юг.

    SELECT pg_catalog.set_config('search_path', '', false);

Решения:

  1. Вероятно, удалите его или измените, falseчтобы оно было true.
  2. Создайте частную схему, которая будет использоваться для доступа ко всем таблицам.

Приведенная выше команда просто деактивирует все общедоступные схемы.

Дополнительную информацию о документации можно найти здесь: https://www.postgresql.org/docs/9.3/ecpg-connect.html


2

Ошибка может быть вызвана ограничениями доступа. Решение:

GRANT ALL PRIVILEGES ON DATABASE my_database TO my_user;

0

Я использовал pgAdmin для создания своих таблиц, и хотя я не использовал зарезервированные слова, сгенерированная таблица имела кавычки в имени, а в нескольких столбцах были кавычки. Вот пример сгенерированного SQL.

CREATE TABLE public."Test"
(
    id serial NOT NULL,
    data text NOT NULL,
    updater character varying(50) NOT NULL,
    "updateDt" time with time zone NOT NULL,
    CONSTRAINT test_pk PRIMARY KEY (id)
)

TABLESPACE pg_default;

ALTER TABLE public."Test"
    OWNER to svc_newnews_app;

Все эти цитаты были вставлены наугад. Мне просто нужно было отбросить и заново создать таблицу без кавычек.

Проверено на pgAdmin 4.26


0

В моем случае в восстановленном файле дампа были эти команды.

CREATE SCHEMA employees;
SET search_path = employees, pg_catalog;

Я прокомментировал их и снова восстановил. Проблема решена


0

Я столкнулся с этой ошибкой, и оказалось, что моя строка подключения указывала на другую базу данных, очевидно, что таблицы там не было.

Я потратил на это несколько часов, и никто больше не упомянул, чтобы дважды проверить строку подключения .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.