sql >> Database >  >> RDS >> PostgreSQL

Rails-rapporten kunnen geen kolom vinden die er is

Namen van SQL-kolommen zijn niet hoofdlettergevoelig, tenzij ze worden aangehaald, de standaard zegt dat identifiers moeten worden genormaliseerd naar hoofdletters, maar PostgreSQL normaliseert naar kleine letters:

Het citeren van een identifier maakt het ook hoofdlettergevoelig, terwijl namen zonder aanhalingstekens altijd worden omgevouwen tot kleine letters. Bijvoorbeeld de identifiers FOO , foo , en "foo" worden door PostgreSQL als hetzelfde beschouwd, maar "Foo" en "FOO" verschillen van deze drie en van elkaar. (Het vouwen van niet-aangehaalde namen naar kleine letters in PostgreSQL is incompatibel met de SQL-standaard, die zegt dat niet-aangehaalde namen naar hoofdletters moeten worden gevouwen. Dus foo moet gelijk zijn aan "FOO" niet "foo" volgens de standaard. Als u draagbare toepassingen wilt schrijven, wordt u geadviseerd om altijd een bepaalde naam te citeren of deze nooit te citeren.)

Je verwijst naar Email in uw SQL:

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

maar PostgreSQL klaagt over email :

column "email" does not exist

Uw niet-geciteerde email wordt behandeld als email omdat PostgreSQL identifiers normaliseert naar kleine letters. Het klinkt alsof je de kolommen met hoofdletters hebt gemaakt door ze dubbel te citeren:

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

of door :Email . te gebruiken om de kolom in een migratie te identificeren. Als u een kolomnaam citeert wanneer deze wordt gemaakt, wordt deze niet genormaliseerd naar kleine letters (of hoofdletters in het standaard SQL-hoofdlettergebruik) en moet u deze dubbel citeren en voor altijd overeenkomen met de hoofdletters:

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

Zodra je Email hebt opgelost , heb je hetzelfde probleem met IP , Username , Reason , en Length :je moet ze allemaal dubbel citeren in elke SQL die ernaar verwijst.

Het beste is om kolom- en tabelnamen in kleine letters te gebruiken, zodat u zich niet altijd zorgen hoeft te maken over het citeren van dingen. Ik raad je aan om je tabel aan te passen om kolomnamen in kleine letters te gebruiken.

Even terzijde, uw 'NULL' letterlijke tekenreeks:

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

ziet er vreemd uit, weet je zeker dat je niet bedoelt dat "Username" is null ? De 'NULL' letterlijke tekenreeks en de NULL-waarde zijn totaal verschillende dingen en je kunt = niet gebruiken of != om dingen te vergelijken met NULL, moet je is null . gebruiken , is not null , is distinct from , of is not distinct from (afhankelijk van je intentie) wanneer NULL's in het spel kunnen zijn.



  1. Oracle 11g - Draaien ongedaan maken

  2. Hoe exportuitvoer in echt CSV-formaat te krijgen in SQL Server Management Studio?

  3. Hoe wijzig ik een MySQL-kolom om NULL toe te staan?

  4. Galera Cluster Cloud-aanbiedingen vergelijken:deel één Amazon AWS