Postgresql-Tabellen sind vorhanden, aber beim Abfragen wird "Relation existiert nicht" angezeigt

84

Ich habe eine Postgresql-Datenbank mit einer Reihe von Tabellen. Wenn ich frage:

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

Ich werde eine Liste der Spalten erhalten, die ordnungsgemäß zurückgegeben wurden.

Wenn ich jedoch abfrage:

SELECT *
FROM "my_table";

Ich bekomme den Fehler:

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

Irgendwelche Gedanken darüber, warum ich die Spalten erhalten kann, aber die Tabelle nicht abfragen kann? Ziel ist es, die Tabelle abfragen zu können.

patkil
quelle
Kannst du dasselbe mit einem anderen Tisch machen? Versuchen Sie, eine neue zu erstellen.
Juan Carlos Oropeza
2
Die angezeigte Abfrage kann nicht funktionieren. WHERE table_name="my_table";ist ungültig, da "my_table"auf einen Spaltennamen verwiesen wird und keine solche Spalte vorhanden ist information_schema.columns. Bitte bearbeiten Sie Ihre Frage und fügen Sie die genaue create table Anweisung hinzu, mit der Sie die Tabelle erstellt haben.
a_horse_with_no_name
1
Überprüfen Sie diese ein dba.stackexchange.com/questions/192897/…
Luv33preet

Antworten:

94

Sie müssen das Schema einschließen, wenn es kein öffentliches ist

SELECT *
FROM <schema>."my_table"

Oder Sie können Ihr Standardschema ändern

SHOW search_path;
SET search_path TO my_schema;

Überprüfen Sie hier Ihr Tabellenschema

SELECT *
FROM information_schema.columns

Geben Sie hier die Bildbeschreibung ein

Wenn sich beispielsweise eine Tabelle im Standardschema befindet public, funktioniert beides einwandfrei

SELECT * FROM parroquias_region
SELECT * FROM public.parroquias_region

Sektoren müssen jedoch das Schema angeben

SELECT * FROM map_update.sectores_point
Juan Carlos Oropeza
quelle
2
Richtige Antwort. Wenn Sie mit der Hierarchie des SQL-Standards Cluster> Katalog> Schema> Tabelle nicht vertraut sind, lesen Sie die Frage: Was ist der Unterschied zwischen einem Katalog und einem Schema in einer relationalen Datenbank? und mein Diagramm .
Basil Bourque
Yup - das hat es geschafft, vielen Dank. Natürlich bekomme ich jetzt permission denied, aber zumindest weiß ich, wohin ich gehen soll.
Patkil
4
Für zukünftige Leser dieses Threads kann dieser Fehler auch auftreten, wie in meinem Fall, wenn der Schemaname und der Tabellenname gemischte Groß- und Kleinschreibung enthalten und nicht einzeln in doppelte Anführungszeichen gesetzt werden. Mit anderen Worten, sie müssen angegeben werden als: "my_Schema". "My_Table"
Snidhi Sofpro
1
@SnidhiSofpro Nun, das passiert auch bei Feldnamen. Mein Vorschlag verwendet nur Kleinbuchstaben, damit Sie nicht den Aufwand von doppelten Anführungszeichen hinzufügen müssen.
Juan Carlos Oropeza
1
Was ist, wenn SET search_path TO my_schema;in der Postgres-Shell alles funktioniert, aber genau das im Python-Code nicht funktioniert? Ich habe keine Groß- und Kleinschreibung. Ich bin sicher!
Alex Jolig
22

Du kannst es versuchen:

SELECT * 
FROM public."my_table"

Vergessen Sie nicht doppelte Anführungszeichen in der Nähe von my_table.

Richie Rizal Amir
quelle
3
Das Hinzufügen von doppelten Anführungszeichen zum Tabellennamen hat bei mir funktioniert. Vielen Dank.
iAkshay
10

Ich musste dem Tabellennamen doppelte Anführungszeichen hinzufügen.

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

???

Anführungszeichen:

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

Viele, viele doppelte Anführungszeichen:

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)

Dies ist postgres 11. Die CREATE TABLE-Anweisungen aus diesem Dump hatten ebenfalls doppelte Anführungszeichen:

DROP TABLE IF EXISTS "COMMONDATA_NWCG_AGENCIES";

CREATE TABLE "COMMONDATA_NWCG_AGENCIES" (
...
dfrankow
quelle
4
Postgres konvertiert standardmäßig alles in Kleinbuchstaben, es sei denn, es werden natürlich doppelte Anführungszeichen verwendet.
Arpit Singh
3

Ich hatte das gleiche Problem, das auftrat, nachdem ich Daten von einer Postgres-Dump-Datenbank wiederhergestellt hatte.

Meine Dump-Datei hatte den folgenden Befehl, von wo aus die Dinge nach Süden gingen.

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

Lösungen:

  1. Wahrscheinlich es entfernen oder das ändern falsezu sein true.
  2. Erstellen Sie ein privates Schema, mit dem auf alle Tabellen zugegriffen wird.

Der obige Befehl deaktiviert einfach alle öffentlich zugänglichen Schemas.

Weitere Informationen zur Dokumentation finden Sie hier: https://www.postgresql.org/docs/9.3/ecpg-connect.html

dmigwi
quelle
1

Der Fehler kann durch Zugriffsbeschränkungen verursacht werden. Lösung:

GRANT ALL PRIVILEGES ON DATABASE my_database TO my_user;
Marcel
quelle
0

Ich habe pgAdmin verwendet, um meine Tabellen zu erstellen, und obwohl ich keine reservierten Wörter verwendet habe, enthielt die generierte Tabelle ein Anführungszeichen im Namen und einige Spalten Anführungszeichen. Hier ist ein Beispiel für das generierte 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;

Alle diese Anführungszeichen wurden "zufällig" eingefügt. Ich musste nur die Tabelle ohne Anführungszeichen löschen und neu erstellen.

Getestet auf pgAdmin 4.26

Zäh
quelle
0

In meinem Fall hatte die wiederhergestellte Dump-Datei diese Befehle.

CREATE SCHEMA employees;
SET search_path = employees, pg_catalog;

Ich habe diese kommentiert und wieder hergestellt. Das Problem wurde behoben

Samsri
quelle
0

Ich habe diesen Fehler festgestellt und es stellte sich heraus, dass meine Verbindungszeichenfolge auf eine andere Datenbank zeigte. Offensichtlich war die Tabelle dort nicht vorhanden.

Ich habe ein paar Stunden damit verbracht und niemand hat erwähnt, dass Sie Ihre Verbindungszeichenfolge überprüfen sollen .

Jeremy Thompson
quelle