आप NuoDB का उपयोग करके रूबी ऑन रेल्स में SQL कमांड को मैन्युअल रूप से कैसे निष्पादित करते हैं


142

मैं मैन्युअल रूप से SQL कमांड निष्पादित करने की कोशिश कर रहा हूं ताकि मैं NuoDB में प्रक्रियाओं का उपयोग कर सकूं।

मैं रूबी ऑन रेल्स का उपयोग कर रहा हूं और मैं निम्नलिखित कमांड का उपयोग कर रहा हूं:

ActiveRecord::Base.connection.execute("SQL query")

"SQL क्वेरी" कोई भी SQL कमांड हो सकती है।

उदाहरण के लिए मेरे पास "फ़ीडबैक" नामक एक तालिका है और जब मैं कमांड निष्पादित करता हूं:

ActiveRecord::Base.connection.execute("SELECT `feedbacks`.* FROM `feedbacks`")

यह केवल मेरे द्वारा अनुरोधित सभी डेटा भेजने के बजाय "सही" प्रतिक्रिया लौटाएगा।

यह रेल कंसोल पर आउटपुट है:

SQL (0.4ms)  SELECT `feedbacks`.* FROM `feedbacks`
 => true

मैं इसका उपयोग NuoDB में संग्रहीत प्रक्रियाओं को कॉल करने के लिए करना चाहूंगा, लेकिन प्रक्रियाओं को कॉल करने पर, यह "सही" प्रतिक्रिया भी लौटाएगा।

क्या वैसे भी मैं एसक्यूएल कमांड को निष्पादित कर सकता हूं और "सही" प्रतिक्रिया प्राप्त करने के बजाय अनुरोधित डेटा प्राप्त कर सकता हूं?

जवाबों:


166

कस्टम SQL कथनों को निष्पादित करने के लिए मैं जिस कार्य कमांड का उपयोग कर रहा हूं वह है:

results = ActiveRecord::Base.connection.execute("foo")

"फू" को एसक्यूएल स्टेटमेंट (यानी "सेलेक्ट * फॉरम टेबल") कहा जाता है।

यह कमांड एक हैश के रूप में मानों का एक सेट लौटाएगा और उन्हें परिणाम चर में डाल देगा।

इसलिए मेरी रेल पर application_controller.rb मैंने इसे जोड़ा:

def execute_statement(sql)
  results = ActiveRecord::Base.connection.execute(sql)

  if results.present?
    return results
  else
    return nil
  end
end

Execute_statement का उपयोग करके पाए गए रिकॉर्ड वापस आ जाएंगे और यदि कोई नहीं है, तो यह शून्य वापस आ जाएगा।

इस तरह मैं इसे उदाहरण के लिए रेल एप्लिकेशन पर कहीं भी कॉल कर सकता हूं:

records = execute_statement("select * from table")

"execute_statement" को NuoDB प्रक्रिया, फ़ंक्शन और डेटाबेस दृश्य भी कह सकते हैं।


3
यदि आप PSQL पर हैं तो यह exec_query का उपयोग करना बेहतर है क्योंकि यह मेमोरी को रिसाव करेगा
23inhouse

3
मुझे आपके प्रश्न में और आपके उत्तर में कोड के बीच अंतर नहीं मिल रहा है। वे दोनों का उपयोग करने लगते हैं ActiveRecord::Base.connection.execute। क्या आप यह बता सकते हैं कि डेटा को प्राप्त करने के लिए आपने वास्तव में क्या बदला true?
RocketR

119

मेरे लिए, मुझे यह हैश वापस करने के लिए नहीं मिला।

results = ActiveRecord::Base.connection.execute(sql)

लेकिन exec_query विधि का उपयोग करके काम किया।

results = ActiveRecord::Base.connection.exec_query(sql)

10
.exec_queryएक ऐसी ActiveRecord::Resultवस्तु देता है जो आसानी से सुलभ .columnsऔर .rowsविशेषताओं के साथ बहुत आसान है । .executeहैश की एक सरणी देता है जो आमतौर पर अधिक परेशानी से निपटने के लिए और शायद स्मृति पर भारी है। मैंने कभी इस्तेमाल नहीं किया exec_query, टिप के लिए धन्यवाद।
फ्रांको रोड्रिग्स 20

9
बस अंतिम टिप्पणी में जोड़ने के लिए, आप आमतौर पर उपयोग करना चाहते हैं .entriesजब .exec_queryपरिणाम की एक सरणी के रूप में प्राप्त करने के लिए उपयोग करना चाहिए।
8bithero

यह मुझे हमेशा ActiveRecord 5 के साथ परिणाम के लिए शून्य देता है एक DELETE क्वेरी चल रही है?
टॉम रॉसी

27

इसी तरह के मुद्दे के साथ दूसरों की मदद करने के लिए हमारे मंच से उत्तर को फिर से तैयार करना:

@connection = ActiveRecord::Base.connection
result = @connection.exec_query('select tablename from system.tables')
result.each do |row|
puts row
end

22
res = ActiveRecord::Base.connection_pool.with_connection { |con| con.exec_query( "SELECT 1;" ) }

उपरोक्त कोड इसके लिए एक उदाहरण है

  1. अपने डेटाबेस-कनेक्शन पर मनमाना एसक्यूएल निष्पादित करना
  2. बाद में कनेक्शन पूल में वापस लौट रहा है

2
आप कनेक्शन के बजाय कनेक्शन पूल का उपयोग क्यों करेंगे? क्या कोई फायदा है? क्या आपके पास इसके बारे में कोई स्रोत होगा?
बोनाफेरनोन्डो

3
@bonafernando, आपका डेटाबेस "बहुत सारे कनेक्शन" त्रुटियों को फेंकना शुरू कर सकता है यदि आपके पास कोड है जो ActiveRecord::Base.connectionबिना कॉल किए उपयोग करता है ActiveRecord::Base.clear_active_connections!। देखें api.rubyonrails.org/v5.2/classes/ActiveRecord/...
संन्यासी

हाँ, आपके उत्तर के पहले मैंने बदल दिया है और देखा है कि मैंने कभी भी "बहुत सारे कनेक्शन" त्रुटि नहीं की है। धन्यवाद!
बोनाफेरनोन्डो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.