2012-05-17 12 views
6

मैं वर्तमान में रेल का उपयोग कर एक मेज पर एक जटिल WHERE खोज करने के लिए कोशिश कर रहा हूँ, मुसीबत मैं त्रुटि मिलती है:रेल रिपोर्ट एक स्तंभ है कि नहीं मिल रहा है वहाँ

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')) 

और मैं उस स्तंभ पता वास्तव में मौजूद है, और एक rails dbconsole कर मेरा पीछा कर देता है:

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

तो यह डेटाबेस में निश्चित रूप से है, किसी को भी इस के साथ किसी भी अनुभव किया गया है?

+3

क्या आप केस-संवेदनशील कॉलम नामों के साथ पोस्टग्रेस का उपयोग कर रहे हैं? –

+0

केस एसक्यूएल और तालिका – nekosune

+0

हम्म में ठीक है, हाँ, मुझे लगता है कि यह एक ही स्थान पर है, हालांकि कॉलम यह कहता है कि गायब है। –

उत्तर

12

एसक्यूएल स्तंभ नाम केस संवेदी जब तक उद्धृत कर रहे हैं, मानक का कहना है कि पहचानकर्ता अपर केस लेकिन 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.)

आप अपने एसक्यूएल में Email संदर्भित कर रहे हैं:

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

लेकिन PostgreSQL email के बारे में शिकायत कर रहा है:

column "email" does not exist 

आपके unquoted Email को email के रूप में माना जा रहा है क्योंकि PostgreSQL पहचानकर्ता को कम मामले में सामान्यीकृत करता है। ऐसा लगता है कि आप डबल उन्हें उद्धृत करके पूंजीकृत नाम के साथ कॉलम बनाया:

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

या :Email का उपयोग कर एक प्रवास में स्तंभ की पहचान करने के द्वारा। आप जब यह बनाई गई है एक स्तंभ नाम बोली है, तो यह नहीं सामान्यीकृत लोअर केस (या SQL मानक मामले में अपर केस) करने के लिए है और आप इसे बोली को दोगुना करने की है और मामले को हमेशा के लिए की भरपाई करेंगे:

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

एक बार जब आप Email को ठीक कर लेंगे, तो आपको IP, Username, Reason, और Length के साथ एक ही समस्या होगी: आपको उन सभी को संदर्भित करने वाले किसी भी SQL में उन्हें उद्धृत करना होगा।

सबसे अच्छा अभ्यास निम्न केस कॉलम और टेबल नामों का उपयोग करना है ताकि आपको हर समय चीजों को उद्धृत करने की चिंता न हो। मैं अनुशंसा करता हूं कि आप अपनी तालिका को कम केस कॉलम नाम रखने के लिए ठीक करें।


एक अलग रूप में के रूप में, अपने 'NULL' स्ट्रिंग शाब्दिक:

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

अजीब लग रहा है, तो आप यकीन है कि आप "Username" is null मतलब नहीं कर रहे हैं? 'NULL' स्ट्रिंग शाब्दिक और नल मान पूरी तरह से अलग-अलग चीजें हैं और आप NULL के विरुद्ध चीजों की तुलना करने के लिए = या != का उपयोग नहीं कर सकते हैं, जब आप NULLs खेल सकते हैं तो आपको is null, is not null, is distinct from, or is not distinct from (अपने इरादे के आधार पर) का उपयोग करना होगा।

+0

धन्यवाद, यह वास्तव में समस्या थी, मैंने अभी मानक मॉडल उत्पन्न मॉडल आदि का उपयोग किया था, इसका मतलब है कि मुझे अब अपने पूरे डीबी डिजाइन दस्तावेज़ को फिर से लिखना और पुनर्मुद्रण करना होगा! आपकी मदद के लिए वैसे भी धन्यवाद। – nekosune

+0

@nekosune: शायद उन सभी पेड़ों को मारने से अपराध आपको भविष्य में इस गलती से बचने में मदद करेगा :) –

+0

मुझे पेड़ों के लिए खेद है, और इससे भी ज्यादा काम करने के लिए यह सब कुछ स्वीकृत हो सकता है इससे पहले कि मैं इसे स्वीकार कर सकूं शुरू करें, लेकिन इस अजीब व्यवहार के कारण अतिरिक्त काम की जरूरत है। – nekosune

1

ऐसा लगता है कि आप त्रुटि डेटाबेस से हैं, लेकिन यदि ऐसा है तो rake db:test:prepare आज़माएं।

सामान्य रूप से, जागरूक रहें कि आपके पास 3 डेटाबेस हैं - परीक्षण, विकास, उत्पादन। तो उन्हें मिश्रित करना और गलत जांचना आसान है।

+0

यह विकास डीबी से था। – nekosune

1

मैं एक ही समस्या यहाँ,

था, लेकिन के रूप में mu-is-too-short कहा, PostgreSQL कॉलम नाम पर मामले संवेदनशीलता के साथ खोज करने के लिए कहा जा सकता है।

तो यह कोड लागू किया मुझे लगता है कि आप देख रहे हैं वही त्रुटि को बायपास करने में कामयाब रहे:

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

देखा \ " संकेत स्तंभ नाम srrounding खैर .. कष्टप्रद के रूप में यह है के रूप में, यह इस समस्या का समाधान है।

संबंधित मुद्दे