PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

I rapporti Rails non riescono a trovare una colonna presente

I nomi delle colonne SQL non fanno distinzione tra maiuscole e minuscole a meno che non siano citate, lo standard dice che gli identificatori dovrebbero essere normalizzati in maiuscolo ma PostgreSQL normalizza in minuscolo:

Citare un identificatore rende anche la distinzione tra maiuscole e minuscole, mentre i nomi senza virgolette vengono sempre piegati in minuscolo. Ad esempio, gli identificatori FOO , foo e "foo" sono considerati uguali da PostgreSQL, ma "Foo" e "FOO" sono diversi da questi tre e l'uno dall'altro. (La piegatura dei nomi senza virgolette in minuscolo in PostgreSQL è incompatibile con lo standard SQL, che dice che i nomi senza virgolette dovrebbero essere piegati in maiuscolo. Pertanto, foo dovrebbe essere equivalente a "FOO" non "foo" secondo la norma. Se vuoi scrivere applicazioni portatili ti consigliamo di citare sempre un nome particolare o di non citarlo mai.)

Stai facendo riferimento a Email nel tuo SQL:

SELECT "bans".* FROM "bans"  WHERE (Email='' ...

ma PostgreSQL si lamenta di email :

column "email" does not exist

La tua Email non quotata viene trattato come email perché PostgreSQL normalizza gli identificatori in minuscolo. Sembra che tu abbia creato le colonne con i nomi in maiuscolo tra virgolette doppie:

create table "bans" (
    "Email" varchar(...)
    ...
)

o utilizzando :Email per identificare la colonna in una migrazione. Se citi il ​​nome di una colonna quando viene creata, non viene normalizzato in minuscolo (o maiuscolo nel caso standard SQL) e dovrai virgolettarlo due volte e abbinare il maiuscolo per sempre:

SELECT "bans".* FROM "bans"  WHERE ("Email"='' ...

Dopo aver corretto Email , avrai lo stesso problema con IP , Username , Reason e Length :dovrai virgolettarli tutti in qualsiasi SQL che li faccia riferimento.

La procedura migliore consiste nell'utilizzare nomi di tabelle e colonne in minuscolo in modo da non doversi preoccupare di citare continuamente le cose. Ti consiglio di correggere la tabella in modo che i nomi delle colonne siano minuscoli.

Per inciso, il tuo 'NULL' letterale stringa:

SELECT "bans".* FROM "bans"  WHERE (Email='' AND IP='' AND (Username='NULL' ))
-- -------------------->------------------>---------->---------------^^^^^^

sembra strano, sei sicuro di non voler dire che "Username" is null ? Il 'NULL' string literal e il valore NULL sono cose completamente diverse e non puoi usare = o != per confrontare le cose con NULL, devi usare is null , is not null , is distinct from o is not distinct from (a seconda delle tue intenzioni) quando potrebbero essere in gioco NULL.