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.
sql
postgresql
patkil
quelle
quelle
WHERE table_name="my_table";
ist ungültig, da"my_table"
auf einen Spaltennamen verwiesen wird und keine solche Spalte vorhanden istinformation_schema.columns
. Bitte bearbeiten Sie Ihre Frage und fügen Sie die genauecreate table
Anweisung hinzu, mit der Sie die Tabelle erstellt haben.Antworten:
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
Wenn sich beispielsweise eine Tabelle im Standardschema befindet
public
, funktioniert beides einwandfreiSELECT * FROM parroquias_region SELECT * FROM public.parroquias_region
Sektoren müssen jedoch das Schema angeben
SELECT * FROM map_update.sectores_point
quelle
permission denied
, aber zumindest weiß ich, wohin ich gehen soll.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!Du kannst es versuchen:
SELECT * FROM public."my_table"
Vergessen Sie nicht doppelte Anführungszeichen in der Nähe von my_table.
quelle
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" ( ...
quelle
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:
false
zu seintrue
.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
quelle
Der Fehler kann durch Zugriffsbeschränkungen verursacht werden. Lösung:
GRANT ALL PRIVILEGES ON DATABASE my_database TO my_user;
quelle
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
quelle
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
quelle
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 .
quelle