Estou tentando executar o seguinte script PHP para fazer uma consulta simples ao banco de dados:
$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());
Isso produz o seguinte erro:
Falha na consulta: ERRO: a relação "sf_bands" não existe
Em todos os exemplos, posso encontrar onde alguém recebe um erro informando que a relação não existe, é porque eles usam letras maiúsculas no nome da tabela. O nome da minha tabela não possui letras maiúsculas. Existe uma maneira de consultar minha tabela sem incluir o nome do banco de dados, ou seja showfinder.sf_bands
?
php
sql
postgresql
quoted-identifier
Keyslinger
fonte
fonte
Respostas:
Pelo que li, esse erro significa que você não está fazendo referência ao nome da tabela corretamente. Um motivo comum é que a tabela é definida com uma grafia maiúscula e minúscula e você está tentando consultá-la.
Em outras palavras, o seguinte falha:
Use aspas duplas para delimitar identificadores, para que você possa usar a ortografia específica entre maiúsculas e minúsculas conforme a tabela é definida.
No seu comentário, você pode adicionar um esquema ao "search_path" para que, quando você fizer referência a um nome de tabela sem qualificar seu esquema, a consulta corresponderá ao nome da tabela verificando cada esquema na ordem. Assim como
PATH
no shell ouinclude_path
no PHP, etc. Você pode verificar seu caminho de pesquisa de esquema atual:Você pode alterar o caminho de pesquisa do esquema:
Veja também http://www.postgresql.org/docs/8.3/static/ddl-schemas.html
fonte
SELECT * FROM SF_Bands
isso ainda falhará, porque o Postgres decide minúscula o nome da tabela para você. Estranho ...Eu tive problemas com isso e esta é a história (triste, mas verdadeira):
Se o nome da sua tabela estiver em letras minúsculas como: contas, você poderá usar:
select * from AcCounTs
e funcionará bemSe o nome da sua tabela estiver em letras minúsculas, como:
accounts
O seguinte irá falhar:select * from "AcCounTs"
Se o nome da sua tabela estiver misturado com maiúsculas e minúsculas, como:
Accounts
O seguinte irá falhar:select * from accounts
Se o nome da sua tabela estiver misturado com maiúsculas e minúsculas, como:
Accounts
O seguinte funcionará OK:select * from "Accounts"
Eu não gosto de lembrar coisas inúteis como essa, mas você precisa;)
fonte
Accounts
, falhará comselect * from Accounts;
a parte mais estranha: o mesmo caso NÃO é idêntico.O Postgres processa uma consulta diferente de outros RDMS. Coloque o nome do esquema entre aspas antes do nome da sua tabela, como "SCHEMA_NAME". "SF_Bands"
fonte
Coloque o parâmetro dbname na sua cadeia de conexão. Funciona para mim enquanto tudo falhou.
Além disso, ao fazer a seleção, especifique o
your_schema
.your_table
como isso:fonte
Eu tive um problema semelhante no OSX, mas tentei brincar com aspas duplas e simples. Para o seu caso, você pode tentar algo como isto
fonte
Isso é realmente útil
Eu cavei mais esses problemas e descobri como definir esse "caminho_de_pesquisa" desativando um novo usuário no banco de dados atual.
Abra Propriedades do DataBase, abra a Planilha "Variáveis" e simplesmente adicione essa variável ao seu usuário com valor real.
Portanto, agora seu usuário receberá esse schema_name por desativação e você poderá usar tableName sem schemaName.
fonte
Você deve escrever o nome do esquema e o nome da tabela entre aspas. Como abaixo:
fonte
Para mim, o problema era que eu tinha usado uma consulta para essa tabela em particular enquanto o Django era inicializado. É claro que isso gerará um erro, porque essas tabelas não existiam. No meu caso, era um
get_or_create
método dentro de um arquivo admin.py, executado sempre que o software executava qualquer tipo de operação (neste caso, a migração). Espero que ajude alguém.fonte
Você deve adicionar o esquema primeiro, por exemplo
Se você não deseja adicionar isso em todas as consultas, tente o seguinte:
Agora vai funcionar:
fonte
A solução mais fácil é alterar o nome da tabela e todos os nomes das colunas para minúsculas e seu problema será resolvido.
Por exemplo:
Table_Name
paratable_name
eColumnName
paracolumnname
fonte