2010-06-29 9 views
12

के साथ कच्चे SQL प्रश्नों को कैसे चलाएं Iquel के साथ कच्चे SQL क्वेरी चलाने के लिए उचित तरीके से अभी तक स्पष्ट नहीं हूं। तो सामान्य की तरह परिणाम में प्रवेशसीक्वेल

DB.fetch("SELECT * FROM zone WHERE dialcode = '#{@dialcode}' LIMIT 1") do |row| 
@zonename = row 
end 

मैं कैसे कच्चे एसक्यूएल के रूप में क्वेरी चला सकते हैं कर सकते हैं:

वर्तमान में मैं इस कोशिश कर रहा हूँ?

if @zonename.name = "UK" 

उत्तर

11

मैं कुछ संकेत दिए गए हैं जो उपयोगी हो सकता है है:

  1. आप बस कर सकता है:

    @zonename = DB.fetch("SELECT * FROM zone WHERE dialcode = ? LIMIT 1", @dialcode).first 
    

    एनबी: आप इस तथ्य वहाँ अधिक मिलान परिणाम हो सकता है कि अनदेखी कर रहे हैं मानदंड। यदि आपको लगता है कई संभव पंक्तियों वापस करने तो आप शायद ऐसा करके परिणाम की एक सरणी का निर्माण करने के ...

    @zonename = DB.fetch("SELECT * FROM zone WHERE dialcode = ? LIMIT 1", @dialcode).all 
    

    और उन सभी प्रसंस्करण चाहते हैं।

  2. रिटर्न सेट एक हैश है। रिकॉर्ड से एक के लिए @zonename अंक तो आप कर सकते हैं

    @zonename[:column_name] 
    

    एक क्षेत्र "COLUMN_NAME" कहा जाता है का उल्लेख करने के। आप @zonename.colum_nname नहीं कर सकते हैं (आप वास्तव में @zonename को कुछ मेटा-प्रोग्रामिंग का उपयोग करके सहायक तरीके से सजाने के लिए सजाने के लिए कर सकते हैं लेकिन चलिए इस पल के लिए अनदेखा करते हैं)।

सीक्वेल एक उत्कृष्ट इंटरफ़ेस है, जितना अधिक आप इसके बारे में अधिक जानेंगे उतना ही आप इसे पसंद करेंगे।

+0

धन्यवाद, मैं अब प्रगति कर सकता हूं – veccy

12

ध्यान दें कि बजाय:

DB.fetch("SELECT * FROM zone WHERE dialcode = '#{@dialcode}' LIMIT 1") 

आपको क्या करना चाहिए:

DB.fetch("SELECT * FROM zone WHERE dialcode = ? LIMIT 1", @dialcode) 

अन्यथा, आप अपने आप को एसक्यूएल इंजेक्शन के लिए खुला है, तो आप @dialcode की सामग्री को नियंत्रित नहीं करते।

+0

क्या आप मुझे बता सकते हैं कि उपयोगकर्ता इनपुट से बचने के लिए हुड के तहत 'fetch' द्वारा किस विधि को बुलाया जाता है? मेरे पास एक जटिल क्वेरी है जो कई विधियों के साथ बनाई गई है और क्वेरी बनाने के दौरान, मेरे डेटाबेस कॉल से अलग से उपयोगकर्ता इनपुट से बचने की आवश्यकता है। –

+0

क्षमा करें, बस इसे दस्तावेज़ों में मिला (जिसे मैं इसे खोजते समय पढ़ रहा था, इसे यहां दूसरों के लिए पोस्ट कर दूंगा): https://github.com/jeremyevans/sequel/blob/cf1e987c1c2f7e74dca5c0f8312149bede659a21/doc/security.rdoc। विधि 'डीबी। लिटरल (my_insecure_string)' है। लाइब्रेरी जेरेमी के लिए धन्यवाद। –

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