2014-09-15 6 views
6

पोस्टग्रेस डेटाबेस तक पहुंचने के लिए पहली बार pg मणि का उपयोग कर। मैंने सफलतापूर्वक कनेक्ट किया है और #exec का उपयोग कर क्वेरी चला सकता है, लेकिन अब #exec_params के साथ एक साधारण क्वेरी बनाना पैरामीटर को प्रतिस्थापित नहीं कर रहा है। अर्थात: #<PG::SyntaxError: ERROR: syntax error at or near "$1" LINE 1: SELECT * FROM $1;^>पीजी: exec_params पैरामीटर की जगह नहीं है?

में

get '/databases/:db/tables/:table' do |db_name, table_name| 
    conn = connect(db_name) 
    query_result = conn.exec_params("SELECT * FROM $1;", [table_name]) 
end 

परिणाम इस तरह के एक सरल उदाहरण की तरह लगता है काम कर पाने के लिए - मैं मूल रूप से इस विधि का उपयोग करने के लिए कैसे गलत समझ रहा हूँ?

उत्तर

8

आप पहचानकर्ता (टेबल और कॉलम नाम के रूप में) के लिए मूल्यों के लिए प्लेसहोल्डर का उपयोग कर सकते, नहीं। यह वह स्थान है जहां आप अपना एसक्यूएल बनाने के लिए स्ट्रिंग इंटरपोलेशन का उपयोग कर फंस गए हैं। बेशक, यदि आप अपने एसक्यूएल के लिए स्ट्रिंग wrangling का उपयोग कर रहे हैं, तो आप सही ढंग से उद्धरण/चीजों से बचने के लिए सुनिश्चित हो; पहचानकर्ता के लिए, कि quote_ident का उपयोग कर का अर्थ है:

+ (Object) quote_ident(str)

एक स्ट्रिंग है जिसमें पहचानकर्ता के रूप में एक SQL क्वेरी में शामिल किए जाने के लिए सुरक्षित है देता है। नोट: यह मानों के लिए उद्धरण फ़ंक्शन नहीं है, लेकिन पहचानकर्ताओं के लिए।

तो तुम कहेंगे कुछ की तरह:

table_name = conn.quote_ident(table_name) 
query_result = conn.exec("SELECT * FROM #{table_name}") 
+0

आह हा, मैं नहीं भेद के बारे में पता था। बहुत धन्यवाद। –

+1

यह एक आम समस्या है, यदि आप कोड के टुकड़ों और वैरिएबल जैसे मूल्यों जैसे पहचानकर्ताओं के बारे में सोचते हैं तो यह समझ में आता है। –

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