Postgresql-tabellen bestaan, maar het krijgen van “relatie bestaat niet” bij het opvragen

Ik heb een postgresql db met een aantal tabellen. Als ik een vraag heb:

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

Ik krijg een lijst met de kolommen die correct worden geretourneerd.

Als ik echter vraag:

SELECT *
FROM "my_table";

Ik krijg de foutmelding:

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

Enig idee waarom ik de kolommen kan krijgen, maar geen query kan uitvoeren op de tabel? Het doel is om de tabel te kunnen doorzoeken.


Antwoord 1, autoriteit 100%

Je moet het schema toevoegen als het geen openbaar schema is

SELECT *
FROM <schema>."my_table"

Of u kunt uw standaardschema wijzigen

SHOW search_path;
SET search_path TO my_schema;

Controleer hier uw tabelschema

SELECT *
FROM information_schema.columns

Als een tabel bijvoorbeeld in het standaardschema publicstaat, werkt dit allebei goed

SELECT * FROM parroquias_region
SELECT * FROM public.parroquias_region

Maar sectoren moeten het schema specificeren

SELECT * FROM map_update.sectores_point

Antwoord 2, autoriteit 26%

Je kunt het proberen:

SELECT * 
FROM public."my_table"

Vergeet geen dubbele aanhalingstekens bij my_table.


Antwoord 3, autoriteit 17%

Ik moest dubbele aanhalingstekens toevoegen aan de tabelnaam.

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

???

Dubbele aanhalingstekens:

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

Heel veel dubbele aanhalingstekens:

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)

Dit is postgres 11. De CREATE TABLE-statements van deze dump hadden ook dubbele aanhalingstekens:

DROP TABLE IF EXISTS "COMMONDATA_NWCG_AGENCIES";
CREATE TABLE "COMMONDATA_NWCG_AGENCIES" (
...

Antwoord 4, autoriteit 6%

Ik kreeg deze fout en het bleek dat mijn verbindingsreeks naar een andere database wees, duidelijk dat de tabel daar niet bestond.

Ik heb hier een paar uur aan besteed en niemand anders heeft gezegd om je verbindingsreeks nogmaals te controleren.


Antwoord 5, autoriteit 4%

Ik had hetzelfde probleem dat zich voordeed nadat ik gegevens had hersteld van een postgres gedumpte db.

Mijn dumpbestand had het onderstaande commando van waaruit het naar het zuiden begon te lopen.

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

Oplossingen:

  1. Verwijder het waarschijnlijk of verander die falsein true.
  2. Maak een privéschema dat wordt gebruikt om toegang te krijgen tot alle tabellen.

De bovenstaande opdracht deactiveert eenvoudig alle openbaar toegankelijke schema’s.

Bekijk hier meer over de documentatie: https://www.postgresql.org /docs/9.3/ecpg-connect.html


Antwoord 6, autoriteit 3%

De fout kan worden veroorzaakt door toegangsbeperkingen. Oplossing:

GRANT ALL PRIVILEGES ON DATABASE my_database TO my_user;

Antwoord 7

Ik gebruikte pgAdmin om mijn tabellen te maken en hoewel ik geen gereserveerde woorden gebruikte, had de gegenereerde tabel een aanhalingsteken in de naam en een paar kolommen hadden aanhalingstekens. Hier is een voorbeeld van de gegenereerde 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;

Al deze aanhalingstekens zijn “willekeurig” ingevoegd. Ik moest de tabel gewoon laten vallen en opnieuw maken zonder de aanhalingstekens.

Getest op pgAdmin 4.26


Antwoord 8

In mijn geval had het dumpbestand dat ik herstelde deze commando’s.

CREATE SCHEMA employees;
SET search_path = employees, pg_catalog;

Ik heb er een opmerking over gemaakt en opnieuw hersteld. Het probleem is opgelost


Antwoord 9

Laten we zeggen dat we een databasenaam hebben als studentsen een schemanaam als studentinformation, dan moeten we om de hele tabel van dit schema te gebruiken eerst het pad instellen wat we kunnen doen in postgresqlzoals:

client.connect()
.then(()=>console.log("connected succesfully"))
.then(()=>client.query("set search_path to students"))
.then(()=>client.query("show search_path"))
.then(()=>client.query("set search_path to studentinformation"))
.then(()=>client.query("show search_path"))
.then(results => console.table(results.rows)) //setting the search path 

Other episodes