3 मॉडल के बिना कस्टम sql क्वेरी निष्पादित करता है


105

मुझे एक स्टैंडअलोन माणिक स्क्रिप्ट लिखने की ज़रूरत है जो डेटाबेस से निपटने के लिए है। मैंने नीचे दिए गए कोड 3 का उपयोग किया

@connection = ActiveRecord::Base.establish_connection(
:adapter => "mysql2",
:host => "localhost",
:database => "siteconfig_development",
:username => "root",
:password => "root123"
)

results = @connection.execute("select * from users")
results.each do |row|
puts row[0]
end

लेकिन त्रुटि हो रही है: -

`<main>': undefined method `execute' for #<ActiveRecord::ConnectionAdapters::ConnectionPool:0x00000002867548> (NoMethodError)

मुझे यहाँ क्या याद आ रहा है?

उपाय

डेनिस-बु से समाधान प्राप्त करने के बाद मैंने इसे निम्नलिखित तरीके से इस्तेमाल किया और यह काम भी किया।

@connection = ActiveRecord::Base.establish_connection(
            :adapter => "mysql2",
            :host => "localhost",
            :database => "siteconfig_development",
            :username => "root",
            :password => "root123"
)

sql = "SELECT * from users"
@result = @connection.connection.execute(sql);
@result.each(:as => :hash) do |row| 
   puts row["email"] 
end

जवाबों:


168

शायद यह कोशिश करें:

ActiveRecord::Base.establish_connection(...)
ActiveRecord::Base.connection.execute(...)

14
FWIW, खाली पारमों का उपयोग करना मुहावरेदार माणिक नहीं है। तो इसके connection.executeबजायconnection().execute
त्रिकोणीयाउंड

रेल 4 पर भी काम करता है।
लेह मैककुलोच

github.com/igorkasyanchuk/execute_sql कम कोड की आवश्यकता है, साथ ही आप इसे सीधे रेल कंसोल में भी कर सकते हैं
इगोर कासीनाचुक

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

8
इस मामले में, कनेक्शन = ActiveRecord :: Base.connection; connection.execute ("SQL क्वेरी") काम करेगा। कम टाइपिंग!
वाटसिमोटो

16
या सिर्फActiveRecord::Base.connection.execute("SQL query")
कैस्पर ग्रुबे जुले

3
इस कनेक्शन को थ्रेडिंग मुद्दों से बचने के लिए बाद में कनेक्शन पूल में लौटना पड़ सकता है: ActiveRecord::Base.connection_pool.checkin(connection) apidock.com/rails/ActiveRecord/ConnectionAdapters/…
lee

35

मैं ActiveRecord::Base.connection.exec_queryइसके बजाय उपयोग करने की सलाह देता हूं , ActiveRecord::Base.connection.executeजिसमें रिटर्न ActiveRecord::Result(रेल में उपलब्ध 3.1+) है, जिसके साथ काम करना थोड़ा आसान है।

फिर आप इसे विभिन्न तरीकों से विभिन्न तरीकों से एक्सेस कर सकते हैं .rows, जैसे .each, या.to_hash

से डॉक्स :

result = ActiveRecord::Base.connection.exec_query('SELECT id, title, body FROM posts')
result # => #<ActiveRecord::Result:0xdeadbeef>


# Get the column names of the result:
result.columns
# => ["id", "title", "body"]

# Get the record values of the result:
result.rows
# => [[1, "title_1", "body_1"],
      [2, "title_2", "body_2"],
      ...
     ]

# Get an array of hashes representing the result (column => value):
result.to_hash
# => [{"id" => 1, "title" => "title_1", "body" => "body_1"},
      {"id" => 2, "title" => "title_2", "body" => "body_2"},
      ...
     ]

# ActiveRecord::Result also includes Enumerable.
result.each do |row|
  puts row['title'] + " " + row['body']
end

नोट: यहाँ से मेरे उत्तर की नकल की


1
जैसा कि कहा गया है, निष्पादित_क्वेरी वास्तविक परिणाम लौटाता है - मैं जो चाहता हूं, जबकि निष्पादन केवल स्थिति की जानकारी देता है।
पॉल चेरोच

24

आप find_by_sql का भी उपयोग कर सकते हैं

# A simple SQL query spanning multiple tables
Post.find_by_sql "SELECT p.title, c.author FROM posts p, comments c WHERE p.id = c.post_id"
> [#<Post:0x36bff9c @attributes={"title"=>"Ruby Meetup", "first_name"=>"Quentin"}>, ...]

मेरी स्क्रिप्ट रेल एप्लिकेशन के बाहर है, इसलिए मुझे नहीं लगता कि find_by_sql काम करेगा।
नीरज

4
आप सही हैं, मैं आपका प्रश्न बहुत जल्दी पढ़ता हूं। यह उत्तर आपके प्रश्न शीर्षक के आधार पर इस पृष्ठ पर आने वाले अन्य लोगों की मदद कर सकता है।
मॉन्ट्रियलमाइक

कैसे एक सरणी लेकिन संबंध नहीं पाने के लिए?
Мал

4

इस बारे में कैसा है :

@client = TinyTds::Client.new(
      :adapter => 'mysql2',
      :host => 'host',
      :database => 'siteconfig_development',
      :username => 'username',
      :password => 'password'

sql = "SELECT * FROM users"

result = @client.execute(sql)

results.each do |row|
puts row[0]
end

आपको TinyTds रत्न को स्थापित करने की आवश्यकता है, क्योंकि आपने इसे अपने प्रश्न में निर्दिष्ट नहीं किया था, मैंने सक्रिय रिकॉर्ड का उपयोग नहीं किया था


1
यकीन है, TinyTds पूरे अन्य मणि है .. यह ActiveRecord नहीं है। इसका उपयोग करने के लिए आपको इसे अलग से स्थापित करना चाहिए।
डेनिस-ब

1
मैं किसी भी अतिरिक्त GEM का उपयोग तब तक नहीं करना चाहता जब तक mysql2 और सक्रिय-रिकॉर्ड उपलब्ध है
नीरज

अच्छा, आपको अपने प्रश्न (टैग / शीर्षक) में उल्लेख करना चाहिए
ant

2
TinyTDS MSSQL और Sybase के साथ काम करता है, यह MySQL के साथ काम नहीं करता है। ant: आपको अपने उत्तर में उल्लेख करना चाहिए, और यह नहीं मान लेना चाहिए कि ओपी उसी आला डीबीएमएस का उपयोग कर रहा है जैसे आप हैं।
क्लिफर्डहॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.