Las tablas de Postgresql existen, pero obtener "la relación no existe" al realizar consultas

84

Tengo una base de datos postgresql con varias tablas. Si consulto:

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

Obtendré una lista de las columnas devueltas correctamente.

Sin embargo, cuando consulto:

SELECT *
FROM "my_table";

Me sale el error:

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

¿Alguna idea sobre por qué puedo obtener las columnas, pero no puedo consultar la tabla? El objetivo es poder consultar la tabla.

patkil
fuente
¿Puedes hacer lo mismo con otra mesa? intente crear uno nuevo.
Juan Carlos Oropeza
2
La consulta que ha mostrado no puede funcionar. WHERE table_name="my_table";no es válido porque hace "my_table"referencia a un nombre de columna y no existe tal columna en information_schema.columns. Por favor, editar su pregunta y añadir el exacto create table sentencia que ha utilizado para crear la tabla.
a_horse_with_no_name
1
compruebe este dba.stackexchange.com/questions/192897/…
Luv33preet

Respuestas:

94

Tienes que incluir el esquema si no es público

SELECT *
FROM <schema>."my_table"

O puede cambiar su esquema predeterminado

SHOW search_path;
SET search_path TO my_schema;

Consulte el esquema de su tabla aquí

SELECT *
FROM information_schema.columns

ingrese la descripción de la imagen aquí

Por ejemplo, si una tabla está en el esquema predeterminado, publicambos funcionarán bien

SELECT * FROM parroquias_region
SELECT * FROM public.parroquias_region

Pero los sectores necesitan especificar el esquema

SELECT * FROM map_update.sectores_point
Juan Carlos Oropeza
fuente
2
Respuesta correcta. Si no está familiarizado con la jerarquía del estándar SQL de Clúster> Catálogo> Esquema> Tabla, consulte la Pregunta ¿Cuál es la diferencia entre un catálogo y un esquema en una base de datos relacional? y mi diagrama .
Basil Bourque
Sí, esto lo hizo, muchas gracias. Claro que ahora lo estoy consiguiendo permission denied, pero eso al menos ya sé adónde ir.
patkil
4
Para los futuros lectores de este hilo, este error también podría ocurrir, como sucedió en mi caso, cuando el nombre del esquema y el nombre de la tabla tienen caracteres de mayúsculas y minúsculas mezclados y no se incluyen individualmente entre comillas dobles. En otras palabras, deben especificarse como: "my_Schema". "My_Table"
Snidhi Sofpro
1
@SnidhiSofpro Bueno, eso también sucede con los nombres de campo. Mi sugerencia es que use nombres en minúsculas para no tener que agregar la molestia de las comillas dobles.
Juan Carlos Oropeza
1
¿Qué pasa si todo funciona SET search_path TO my_schema;en el shell de Postgres pero lo exacto no funciona en el código Python? No tengo ningún problema que distinga entre mayúsculas y minúsculas. ¡Estoy seguro!
Alex Jolig
22

Puedes probar:

SELECT * 
FROM public."my_table"

No olvide las comillas dobles cerca de my_table.

Richie Rizal Amir
fuente
3
Agregar comillas dobles al nombre de la tabla funcionó para mí. Gracias.
iAkshay
10

Tuve que incluir comillas dobles con el nombre de la tabla.

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

???

Doble comillas:

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

Muchas comillas dobles:

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)

Esto es postgres 11. Las declaraciones CREATE TABLE de este volcado también tenían comillas dobles:

DROP TABLE IF EXISTS "COMMONDATA_NWCG_AGENCIES";

CREATE TABLE "COMMONDATA_NWCG_AGENCIES" (
...
dfrankow
fuente
4
Postgres por defecto convierte todo a minúsculas a menos que, por supuesto, se utilicen comillas dobles.
Arpit Singh
3

Tuve el mismo problema que ocurrió después de restaurar los datos de una base de datos descargada de Postgres.

Mi archivo de volcado tenía el comando a continuación desde donde las cosas comenzaron a ir hacia el sur.

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

Soluciones:

  1. Probablemente eliminarlo o cambiarlo falsepara que sea true.
  2. Cree un esquema privado que se utilizará para acceder a todas las tablas.

El comando anterior simplemente desactiva todos los esquemas de acceso público.

Consulte más sobre la documentación aquí: https://www.postgresql.org/docs/9.3/ecpg-connect.html

dmigwi
fuente
1

El error puede deberse a restricciones de acceso. Solución:

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

Estaba usando pgAdmin para crear mis tablas y, aunque no estaba usando palabras reservadas, la tabla generada tenía una cita en el nombre y un par de columnas tenían comillas. Aquí hay un ejemplo del SQL generado.

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;

Todas estas citas se insertaron "al azar". Solo necesitaba soltar y volver a crear la tabla sin las comillas.

Probado en pgAdmin 4.26

Correoso
fuente
0

En mi caso, el archivo de volcado que restauré tenía estos comandos.

CREATE SCHEMA employees;
SET search_path = employees, pg_catalog;

Los he comentado y los he restaurado de nuevo. El problema se resolvió

samsri
fuente
0

Encontré este error y resultó que mi cadena de conexión apuntaba a otra base de datos, obviamente la tabla no existía allí.

Pasé algunas horas en esto y nadie más ha mencionado que vuelva a verificar su cadena de conexión .

Jeremy Thompson
fuente