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


Estoy intentando ejecutar el siguiente script PHP para hacer una simple consulta de 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:

La consulta falló: ERROR: la relación "sf_bands" no existe

En todos los ejemplos puedo encontrar donde alguien obtiene un error indicando 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 forma de consultar mi tabla sin incluir la base de datos nombre, es decir, showfinder.sf_bands?

Author: a_horse_with_no_name, 2009-03-30

7 answers

Por lo que he leído, este error significa que no está 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á tratando de consultarla con todas las minúsculas.

En otras palabras, lo siguiente falla:

CREATE TABLE "SF_Bands" ( ... );

SELECT * FROM sf_bands;  -- ERROR!

Use comillas dobles para delimitar los identificadores de modo 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";

Re su comentario, puede agregar un esquema a la "search_path" para que cuando hace referencia a un nombre de tabla sin calificar su esquema, la consulta coincidirá con ese nombre de tabla al marcar cada esquema en orden. Al igual que PATH en el shell o include_path en PHP, etc. Puede comprobar su ruta de búsqueda de esquema actual:

SHOW search_path
  "$user",public

Puede cambiar la ruta de búsqueda de esquema:

SET search_path TO showfinder,public;

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

 206
Author: Bill Karwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-29 20:59:22

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

  1. Si el nombre de la tabla es todo minúsculo como: cuentas puedes usar: select * from AcCounTs y funcionará bien

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

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

  4. Si el nombre de la tabla es caso mixto como : Accounts Lo siguiente funcionará OK: select * from "Accounts"

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

 52
Author: Mitzi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-23 06:41:28

Postgres proceso de consulta diferente de otros RDM. Ponga el nombre del esquema entre comillas dobles antes del nombre de la tabla, "SCHEMA_NAME"."SF_Bands"

 12
Author: Ugur Artun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-23 06:52:21

Coloque el parámetro dbname en la cadena de conexión. Funciona para mí mientras todo lo demás fallaba.

También al hacer la selección, especifique el your_schema.your_table así:

select * from my_schema.your_table
 9
Author: JarosPL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-06 19:43:04

Tuve un problema similar en OSX, pero traté de 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"
 3
Author: sav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-05 19:49:05

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

 0
Author: Özer S.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-05 15:30:39

Esto es realmente útil

SET search_path TO schema,public;

Investigué más sobre estos problemas y descubrí cómo establecer este "search_path" por defoult para un nuevo usuario en la base de datos actual.

Abra las propiedades de la base de datos y luego abra la hoja " Variables" y simplemente agregue esta variable para su usuario con valor real.

Así que ahora su usuario obtendrá este schema_name por defoult y podría usar tableName sin SchemaName.

 0
Author: Alexander Kuzichkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-16 07:29:44