PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Os relatórios do Rails não podem encontrar uma coluna que esteja lá


Os nomes das colunas SQL não diferenciam maiúsculas de minúsculas, a menos que sejam citados, o padrão diz que os identificadores devem ser normalizados para maiúsculas, mas o PostgreSQL normaliza para minúsculas:

A citação de um identificador também diferencia maiúsculas de minúsculas, enquanto os nomes sem aspas são sempre dobrados para letras minúsculas. Por exemplo, os identificadores FOO , foo , e "foo" são considerados iguais pelo PostgreSQL, mas "Foo" e "FOO" são diferentes destes três e entre si. (A dobragem de nomes sem aspas para letras minúsculas no PostgreSQL é incompatível com o padrão SQL, que diz que nomes sem aspas devem ser dobrados para maiúsculas. Assim, foo deve ser equivalente a "FOO" não "foo" de acordo com o padrão. Se você deseja escrever aplicativos portáteis, é aconselhável sempre citar um nome específico ou nunca citá-lo.)

Você está fazendo referência a Email em seu SQL:
SELECT "bans".* FROM "bans"  WHERE (Email='' ...

mas o PostgreSQL está reclamando do email :
column "email" does not exist

Seu Email não citado está sendo tratado como email porque o PostgreSQL normaliza os identificadores para letras minúsculas. Parece que você criou as colunas com nomes em maiúsculas citando-as duas vezes:
create table "bans" (
    "Email" varchar(...)
    ...
)

ou usando :Email para identificar a coluna em uma migração. Se você citar um nome de coluna quando ele for criado, ele não será normalizado para minúsculas (ou maiúsculas no caso padrão do SQL) e você terá que aspas duplas e corresponder às maiúsculas para sempre:
SELECT "bans".* FROM "bans"  WHERE ("Email"='' ...

Depois de corrigir Email , você terá o mesmo problema com IP , Username , Reason e Length :você terá que colocar aspas duplas em qualquer SQL que faça referência a eles.

A melhor prática é usar nomes de colunas e tabelas em letras minúsculas para que você não precise se preocupar em citar coisas o tempo todo. Eu recomendo que você corrija sua tabela para ter nomes de coluna em letras minúsculas.

Como um aparte, seu 'NULL' literal de string:
SELECT "bans".* FROM "bans"  WHERE (Email='' AND IP='' AND (Username='NULL' ))
-- -------------------->------------------>---------->---------------^^^^^^

parece estranho, você tem certeza que não quer dizer que "Username" is null ? O 'NULL' string literal e o valor NULL são coisas totalmente diferentes e você não pode usar = ou != para comparar as coisas com NULL, você deve usar is null , is not null , is distinct from , ou is not distinct from (dependendo da sua intenção) quando NULLs podem estar em jogo.