Tabele Postgresql istnieją, ale otrzymywanie informacji „relacja nie istnieje” podczas wykonywania zapytania

87

Mam bazę danych postgresql z wieloma tabelami. Jeśli zapytam:

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

Otrzymam listę poprawnie zwróconych kolumn.

Jednak kiedy pytam:

SELECT *
FROM "my_table";

Wyskakuje mi błąd:

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

Masz jakieś przemyślenia na temat tego, dlaczego mogę pobrać kolumny, ale nie mogę wysłać zapytania do tabeli? Celem jest umożliwienie przeszukiwania tabeli.

patkil
źródło
czy możesz zrobić to samo z innym stołem? spróbuj stworzyć nowy.
Juan Carlos Oropeza
2
Zapytanie, które pokazałeś, nie działa. WHERE table_name="my_table";jest nieprawidłowy, ponieważ "my_table"odwołuje się do nazwy kolumny i nie ma takiej kolumny w information_schema.columns. Proszę edytować swoje pytanie i dodać dokładnie create table oświadczenie użyty do tworzenia tabeli.
a_horse_with_no_name

Odpowiedzi:

97

Musisz dołączyć schemat, jeśli nie jest to publiczny

SELECT *
FROM <schema>."my_table"

Możesz też zmienić domyślny schemat

SHOW search_path;
SET search_path TO my_schema;

Sprawdź tutaj schemat tabeli

SELECT *
FROM information_schema.columns

wprowadź opis obrazu tutaj

Na przykład, jeśli tabela jest na schemacie domyślnym, publicoba te działania będą działać poprawnie

SELECT * FROM parroquias_region
SELECT * FROM public.parroquias_region

Ale sektory muszą określić schemat

SELECT * FROM map_update.sectores_point
Juan Carlos Oropeza
źródło
3
Poprawna odpowiedź. Jeśli nie znasz hierarchii standardu SQL Klaster> Katalog> Schemat> Tabela, zobacz Pytanie: Jaka jest różnica między katalogiem a schematem w relacyjnej bazie danych? i mój schemat .
Basil Bourque
Tak - to wystarczyło, wielkie dzięki. Oczywiście teraz rozumiempermission denied , ale przynajmniej wiem, dokąd się udać.
patkil
5
Dla przyszłych czytelników tego wątku ten błąd może również wystąpić, podobnie jak w moim przypadku, gdy nazwa schematu i nazwa tabeli mają mieszane znaki wielkości liter i nie są ujęte pojedynczo w podwójne cudzysłowy. Innymi słowy, muszą być określone jako: „mój_Schemat”. „Moja_Tabela”
Snidhi Sofpro
1
@SnidhiSofpro Cóż, to również zdarza się w przypadku nazw pól. Proponuję po prostu używać małych liter, więc nie musisz dodawać podwójnych cudzysłowów.
Juan Carlos Oropeza
1
Co jeśli wszystko działa SET search_path TO my_schema;w powłoce postgres, ale dokładnie nie działa w kodzie Pythona? Nie mam problemów z rozróżnianiem wielkości liter. Jestem pewien!
Alex Jolig
24

Możesz spróbować:

SELECT * 
FROM public."my_table"

Nie zapomnij o podwójnych cudzysłowach w pobliżu my_table.

Richie Rizal Amir
źródło
3
Dodanie podwójnych cudzysłowów do nazwy tabeli zadziałało dla mnie. Dzięki.
iAkshay
12

Musiałem dodać podwójne cudzysłowy przy nazwie tabeli.

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".

???

Podwójne cudzysłowy:

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

Wiele, wiele podwójnych cudzysłowów:

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)

To jest postgres 11. Instrukcje CREATE TABLE z tego zrzutu również miały podwójne cudzysłowy:

DROP TABLE IF EXISTS "COMMONDATA_NWCG_AGENCIES";

CREATE TABLE "COMMONDATA_NWCG_AGENCIES" (
...
dfrankow
źródło
4
Postgres domyślnie konwertuje wszystko na małe litery, chyba że oczywiście używane są cudzysłowy.
Arpit Singh
3

Miałem ten sam problem, który wystąpił po przywróceniu danych z bazy danych zrzuconej przez Postgres.

Mój plik zrzutu miał poniższe polecenie, z którego wszystko zaczęło zmierzać na południe.

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

Rozwiązania:

  1. Prawdopodobnie usuń go lub zmień falsenatrue .
  2. Utwórz prywatny schemat, który będzie używany do uzyskiwania dostępu do wszystkich tabel.

Powyższe polecenie po prostu dezaktywuje wszystkie publicznie dostępne schematy.

Sprawdź więcej w dokumentacji tutaj: https://www.postgresql.org/docs/9.3/ecpg-connect.html

dmigwi
źródło
2

Błąd może być spowodowany ograniczeniami dostępu. Rozwiązanie:

GRANT ALL PRIVILEGES ON DATABASE my_database TO my_user;
Marcel
źródło
0

Używałem pgAdmin do tworzenia moich tabel i chociaż nie używałem słów zastrzeżonych, wygenerowana tabela miała cudzysłów w nazwie, a kilka kolumn zawierało cudzysłowy. Oto przykład wygenerowanego kodu 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;

Wszystkie te cudzysłowy zostały wstawione „losowo”. Musiałem tylko upuścić i ponownie utworzyć tabelę bez cudzysłowów.

Przetestowano na pgAdmin 4.26

Żucia
źródło
0

W moim przypadku przywrócony plik zrzutu zawiera te polecenia.

CREATE SCHEMA employees;
SET search_path = employees, pg_catalog;

Skomentowałem je i ponownie przywróciłem. Problem został rozwiązany

samsri
źródło
0

Trafiłem na ten błąd i okazało się, że moje parametry połączenia wskazywały na inną bazę danych, oczywiście tabela tam nie istniała.

Spędziłem nad tym kilka godzin i nikt inny nie wspomniał o podwójnym sprawdzaniu parametrów połączenia .

Jeremy Thompson
źródło