Таблиці Postgresql існують, але отримання “відношення не існує” при запиті


88

У мене є postgresql db з кількома таблицями. Якщо я запитую:

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

Відповіді:


98

Ви повинні включити схему, якщо вона не є загальнодоступною

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 Кластер> Каталог> Схема> Таблиця, див. Запитання, Яка різниця між каталогом та схемою в реляційній базі даних? і моя схема .
Василь Бурк

Так - це вдалося, велике спасибі. Звичайно, зараз я отримую 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.