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.
sql
postgresql
patkil
źródło
źródło
WHERE table_name="my_table";
jest nieprawidłowy, ponieważ"my_table"
odwołuje się do nazwy kolumny i nie ma takiej kolumny winformation_schema.columns
. Proszę edytować swoje pytanie i dodać dokładniecreate table
oświadczenie użyty do tworzenia tabeli.Odpowiedzi:
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
Na przykład, jeśli tabela jest na schemacie domyślnym,
public
oba te działania będą działać poprawnieSELECT * FROM parroquias_region SELECT * FROM public.parroquias_region
Ale sektory muszą określić schemat
SELECT * FROM map_update.sectores_point
źródło
permission denied
, ale przynajmniej wiem, dokąd się udać.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!Możesz spróbować:
SELECT * FROM public."my_table"
Nie zapomnij o podwójnych cudzysłowach w pobliżu my_table.
źródło
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" ( ...
źródło
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:
false
natrue
.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
źródło
Błąd może być spowodowany ograniczeniami dostępu. Rozwiązanie:
GRANT ALL PRIVILEGES ON DATABASE my_database TO my_user;
źródło
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
źródło
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
źródło
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 .
źródło