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
?
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
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):
-
Si el nombre de la tabla es todo minúsculo como: cuentas puedes usar:
select * from AcCounTs
y funcionará bien Si el nombre de la tabla es todo minúsculo como:
accounts
Lo siguiente fallará:select * from "AcCounTs"
Si el nombre de la tabla es caso mixto como :
Accounts
Lo siguiente fallará:select * from accounts
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;)
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"
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
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"
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.
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.
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