2012-05-17 18 views
6

Actualmente estoy tratando de hacer una complicada WHERE búsqueda en una tabla utilizando los carriles, el problema se me sale el error:informes Carriles no pueden encontrar una columna que está allí

PG::Error: ERROR: column "email" does not exist 
LINE 1: SELECT "bans".* FROM "bans" WHERE (Email='' AND IP='' AND (... 
             ^
: SELECT "bans".* FROM "bans" WHERE (Email='' AND IP='' AND (Username='NULL')) 

Y sé que la columna existe en realidad, y haciendo un rails dbconsole me da lo siguiente:

Jungle=> select * from bans; 
id | Username | IP | Email | Reason | Length | created_at | updated_at 
----+----------+----+-------+--------+--------+------------+------------ 
(0 rows) 

Así que este es sin duda en la base de datos, ¿alguien ha tenido alguna experiencia con esto?

+3

¿está utilizando postgres con nombres de columna entre mayúsculas y minúsculas? –

+0

la caja es exactamente lo mismo, aunque en el SQL y la tabla – nekosune

+0

Hmm, sí, supongo que es en un solo lugar, a pesar de la columna dice que falta, en todos los niveles inferiores. –

Respuesta

12

nombres de columna de SQL son sensibles a mayúsculas a menos citado, la norma dice que los identificadores deben ser normalizados a mayúsculas, pero PostgreSQL normalizes to lower case:

Quoting an identifier also makes it case-sensitive, whereas unquoted names are always folded to lower case. For example, the identifiers FOO , foo , and "foo" are considered the same by PostgreSQL, but "Foo" and "FOO" are different from these three and each other. (The folding of unquoted names to lower case in PostgreSQL is incompatible with the SQL standard, which says that unquoted names should be folded to upper case. Thus, foo should be equivalent to "FOO" not "foo" according to the standard. If you want to write portable applications you are advised to always quote a particular name or never quote it.)

que está haciendo referencia Email en su SQL:

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

pero PostgreSQL se queja de email:

column "email" does not exist 

Su Email sin comillas se está tratando como email porque PostgreSQL normaliza los identificadores en minúsculas. Suena como que ha creado las columnas con nombres en mayúsculas con una cita doble ellas:

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

o utilizando :Email para identificar la columna en una migración. Si cita un nombre de columna cuando se crea, entonces no se normaliza a minúsculas (o mayúsculas en el caso estándar SQL) y que tendrá que duplicar la cita y juego con la caja siempre:

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

Una vez que arregle Email, tendrá el mismo problema con IP, Username, Reason y Length: tendrá que doblar todas las citas en cualquier SQL que haga referencia a ellas.

La mejor práctica es utilizar nombres de columnas y tablas de minúsculas para que no tenga que preocuparse por las citas todo el tiempo. Te recomiendo que arregles tu tabla para tener nombres de columna en minúsculas.


Como acotación al margen, su 'NULL' cadena literal:

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

parece extraño, ¿está seguro de que no quiere decir "Username" is null? El literal de cadena 'NULL' y el valor NULL son cosas completamente diferentes y no puede usar = o != para comparar cosas con NULL, tiene que usar is null, is not null, is distinct from, or is not distinct from (dependiendo de su intención) cuando NULLs podrían estar en juego.

+0

Gracias, ese fue exactamente el problema, acabo de utilizar los rieles estándar para generar modelos, etc., ¡Esto significa que ahora tengo que reescribir y volver a imprimir todo el documento de diseño de BD! Gracias de todos modos por tu ayuda. – nekosune

+0

@nekosune: Tal vez la culpa por matar a todos esos árboles te ayudará a evitar este error en el futuro :) –

+0

Lo siento por los árboles, sí, más aún por el trabajo que tomará lograr que el cambio sea aprobado antes de que pueda comenzar, pero el trabajo extra causado por este extraño comportamiento lo necesita. – nekosune

1

Parece que no es un error de una base de datos de prueba, pero si es así, intente rake db:test:prepare.

En general, tenga en cuenta que tiene 3 bases de datos: prueba, desarrollo, producción. Por lo tanto, es fácil mezclarlos y verificar el incorrecto.

+0

Era del desarrollo db. – nekosune

1

que tenían el mismo problema aquí,

sino como mu-is-too-short dijo, PostgreSQL puede ser contada a búsqueda con mayúsculas y minúsculas en los nombres de las columnas.

Así por implementado este código que lograron evitar el mismo error que estás frente a:?

Transaction.find(:all,:conditions => ["(date between ? and ?) AND \"Membership_id\" = ?", Time.now.at_beginning_of_month, Time.now.end_of_month,membership.id]) 

notado la \" signo srrounding el nombre de columna Bueno .. tan molesto como es, esa es la solución a este problema.

Cuestiones relacionadas