php - No se puede simplemente usar el nombre de la tabla PostgreSQL("la relación no existe")
quoted-identifier (6)
Consulta de proceso de Postgres diferente de otros RDMS. Ponga el nombre del esquema en comillas dobles antes del nombre de su tabla, como "SCHEMA_NAME". "SF_Bands"
Estoy tratando de ejecutar el siguiente script PHP para hacer una consulta de base de datos simple:
$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, puedo encontrar que alguien obtiene un error que indica que la relación no existe, es porque usan letras mayúsculas en su nombre de 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
?
Para mí, el problema era que había utilizado una consulta en esa tabla en particular mientras Django se inicializaba. Por supuesto, arrojará un error, porque esas tablas no existían. En mi caso, se trataba de un método get_or_create
dentro de un archivo admin.py, que se ejecutaba cada vez que el software ejecutaba algún tipo de operación (en este caso, la migración). Espero que ayude a alguien.
Pon el parámetro dbname en tu cadena de conexión. Funciona para mí, mientras que todo lo demás falló.
Además, al hacer la selección, especifique el your_schema
. your_table
así:
select * from my_schema.your_table
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á intentando consultarla con minúsculas.
En otras palabras, el 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 casos mixtos específica a medida que se define la tabla.
SELECT * FROM "SF_Bands";
Con respecto a 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 PATH
en Shell o include_path
en PHP, etc. Puede verificar su ruta actual de búsqueda de esquema:
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
Tuve problemas con esto y esta es la historia (triste pero verdadera):
Si el nombre de su tabla es en minúsculas, como: cuentas que puede usar:
select * from AcCounTs
y funcionará bienSi el nombre de la tabla es en minúsculas, como:
accounts
siguiente fallará:select * from "AcCounTs"
Si el nombre de su tabla es mixto, haga lo siguiente:
Accounts
Las siguientes fallas:select * from accounts
Si el nombre de la tabla es mixto,
Accounts
siguiente:Accounts
Lo siguiente funcionará bien:select * from "Accounts"
No me gusta recordar cosas inútiles como esta, pero tienes que hacerlo;)
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"