No se puede simplemente usar el nombre de la tabla PostgreSQL ("la relación no existe")

183

Estoy tratando de ejecutar el siguiente script PHP para hacer una consulta simple a la base de datos:

$db_host = "localhost";
$db_name = "showfinder";
$username = "user";
$password = "password";
$dbconn = pg_connect("host=$db_host dbname=$db_name user=$username password=$password")
    or die('Could not connect: ' . pg_last_error());

$query = 'SELECT * FROM sf_bands LIMIT 10';
$result = pg_query($query) or die('Query failed: ' . pg_last_error());

Esto produce el siguiente error:

Consulta fallida: ERROR: la relación "sf_bands" no existe

En todos los ejemplos que puedo encontrar donde alguien obtiene un error que indica que la relación no existe, es porque usan letras mayúsculas en el nombre de su tabla. El nombre de mi tabla no tiene letras mayúsculas. ¿Hay alguna manera de consultar mi tabla sin incluir el nombre de la base de datos, es decir showfinder.sf_bands?

Keyslinger
fuente
2
¿Está seguro de que existe la tabla sf_bands? ¿Funciona showfinder.sf_bands?
brian-brazil
1
showfinder.sf_bands funciona perfectamente
Keyslinger
Tal vez debo señalar que mi base de datos se ha migrado desde MySQL
Keyslinger
¿Puedes probar pg_query ($ dbconn, $ query)? La conexión implícita puede causar problemas difíciles de depurar, así como eliminarla como un posible problema. ¿También puedes probar pg_dbname ($ dbconn) para asegurarte de que realmente esté conectado al showfinder?
brian-brazil
1
+1 por mencionar que las letras mayúsculas son el problema. Pasé una hora tratando de descubrir por qué no podía seleccionar de una sola tabla en PostgreSQL. Que programa tan terrible.
Brain2000

Respuestas:

298

Por lo que he leído, este error significa que no estás haciendo referencia al nombre de la tabla correctamente. Una razón común es que la tabla se define con una ortografía de mayúsculas y minúsculas, y está intentando consultarla en minúsculas.

En otras palabras, lo siguiente falla:

CREATE TABLE "SF_Bands" ( ... );

SELECT * FROM sf_bands;  -- ERROR!

Use comillas dobles para delimitar identificadores para que pueda usar la ortografía de mayúsculas y minúsculas específica a medida que se define la tabla.

SELECT * FROM "SF_Bands";

En su comentario, puede agregar un esquema a "search_path" para que cuando haga referencia a un nombre de tabla sin calificar su esquema, la consulta coincida con ese nombre de tabla marcando cada esquema en orden. Al igual que PATHen el shell o include_pathen PHP, etc. Puede verificar su ruta de búsqueda de esquema actual:

SHOW search_path
  "$user",public

Puede cambiar su ruta de búsqueda de esquema:

SET search_path TO showfinder,public;

Ver también http://www.postgresql.org/docs/8.3/static/ddl-schemas.html

Bill Karwin
fuente
Ups, perdóname. Quise decir que el nombre de mi tabla no tiene letras mayúsculas, no el nombre de mi base de datos.
Keyslinger
13
Parece que incluso si escribe SELECT * FROM SF_Bandsesto todavía fallará, porque Postgres decide poner en minúscula ese nombre de tabla para usted. Extraño ...
Roman Starkov
3
@romkyns: Sí, esto es bastante común en todas las marcas RDBMS, ya que los identificadores no delimitados se anuncian como "sin distinción entre mayúsculas y minúsculas". Pero no distinguen entre mayúsculas y minúsculas porque la forma en que lo han implementado es forzar minúsculas. Esto coincide con el nombre de la tabla solo si ha permitido que el nombre de la tabla esté en minúsculas cuando definió la tabla. Si usa delimitadores de comillas dobles cuando CREA TABLA, debe usar delimitadores cuando hace referencia en consultas.
Bill Karwin
Postgres pone en minúscula automáticamente los nombres de las tablas si no están entre comillas? Eso es bastante tonto ...
Andy
@Andy, cuando escribes tu propia base de datos SQL, puedes implementar identificadores que no distingan entre mayúsculas y minúsculas de otra manera. :)
Bill Karwin
76

Tuve problemas con esto y esta es la historia (triste pero verdadera):

  1. Si el nombre de su tabla está en minúsculas como: cuentas que puede usar: select * from AcCounTsy funcionará bien

  2. Si el nombre de su tabla es todo en minúsculas como: accounts Lo siguiente fallará: select * from "AcCounTs"

  3. Si el nombre de su tabla es un caso mixto como: Accounts Lo siguiente fallará: select * from accounts

  4. Si el nombre de su tabla es una combinación de mayúsculas y minúsculas como: Accounts Lo siguiente funcionará bien: select * from "Accounts"

No me gusta recordar cosas inútiles como esta, pero tienes que hacerlo;)

Mitzi
fuente
1
Lo mismo para los nombres de columna en cláusulas where
Roland
8
5. La combinación de mayúsculas y minúsculas Accountsfallará select * from Accounts;. Encuentro la parte más extraña: el mismo caso NO es idéntico.
Roland
77
Todo lo que hay que hacer: todos los nombres en la consulta postgres son minúsculas, a menos que use comillas.
Erndob
1
La cuarta opción funcionó para mí, aunque no estoy usando PHP
Sayari
2
¡Gracias por presentar todas las interacciones! :)
GetHacked
16

Postgres consulta de proceso diferente de otros RDMS. Ponga el nombre del esquema entre comillas dobles antes del nombre de su tabla como este, "SCHEMA_NAME". "SF_Bands"

Ugur Artun
fuente
77
¿Qué agrega su respuesta a la respuesta previamente aceptada, votada 22 veces y con muchos detalles?
Yaroslav
16

Ponga el parámetro dbname en su cadena de conexión. Funciona para mí mientras que todo lo demás falló.

También al hacer la selección, especifique el your_schema. your_tableMe gusta esto:

select * from my_schema.your_table
JarosPL
fuente
1
Poner el nombre del esquema en, por ejemplo, my_schema.my_relation en la consulta ayudó.
JoeTidee
2
¡Muchas gracias! ¡Realmente me ayuda a resolver el problema! Pero, ¿hay alguna manera de que pueda omitir el nombre del esquema?
Charlotte
8

Tuve un problema similar en OSX pero intenté jugar con comillas dobles y simples. Para su caso, podría intentar algo como esto

$query = 'SELECT * FROM "sf_bands"'; // NOTE: double quotes on "sf_Bands"
sav
fuente
4

Esto es realmente útil

SET search_path TO schema,public;

Investigué más sobre estos problemas y descubrí cómo configurar este "search_path" al buscar un nuevo usuario en la base de datos actual.

Abra las Propiedades de DataBase, luego abra la Hoja "Variables" y simplemente agregue esta variable para su usuario con valor real.

Entonces, su usuario obtendrá este nombre_esquema por desconfiguración y podría usar tableName sin schemaName.

Alexander Kuzichkin
fuente
4

Debe escribir el nombre del esquema y el nombre de la tabla en la marca de qutotation. Como a continuación:

select * from "schemaName"."tableName";
kira
fuente
1

Para mí, el problema era que había usado una consulta a esa tabla en particular mientras se inicializaba Django. Por supuesto, arrojará un error, porque esas tablas no existían. En mi caso, era un get_or_createmétodo dentro de un archivo admin.py, que se ejecutaba cada vez que el software ejecutaba cualquier tipo de operación (en este caso, la migración). Espero que ayude a alguien.

Özer S.
fuente
0

Primero debe agregar el esquema, p. Ej.

SELECT * FROM place.user_place;

Si no desea agregar eso en todas las consultas, intente esto:

SET search_path TO place;

Ahora funcionará:

SELECT * FROM user_place;
Alexis Gamarra
fuente
0

La solución más fácil es simplemente cambiar el nombre de la tabla y todos los nombres de columna a minúsculas y su problema se resolverá.

Por ejemplo:

  • Cambiar Table_Namea table_name y
  • Cambiar ColumnNameacolumnname
meMadhav
fuente