3 টি মডেল ছাড়াই কাস্টম এসকিএল কোয়েরি কার্যকর করে ails


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
এফডাব্লুআইডাব্লু, খালি প্যারাম ব্যবহার করা আইডোমেটিক রুবি নয়। তাই কি connection.executeবদলেconnection().execute
radixhound

4 রেলগুলিতেও কাজ করে।
লেইগ ম্যাককালোক

github.com/igorkasyanchuk/execute_sql কম কোডের প্রয়োজন হয় এবং আপনি এটি সরাসরি রেল
কনসোলেও

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

8
এই ক্ষেত্রে, সংযোগ = অ্যাক্টিভেকর্ড :: বেস.connection; कनेक्शन.execute ("এসকিউএল কোয়েরি") কাজ করবে। কম টাইপিং!
ওয়াটসিমোটো

16
বা কেবলActiveRecord::Base.connection.execute("SQL query")
ক্যাস্পার গ্রুবে

3
এই সংযোগ সংযোগ পুকুর পরে আবার ফিরে যেতে চান বিষয় থ্রেডিং এড়াতে থাকতে পারে ActiveRecord::Base.connection_pool.checkin(connection) apidock.com/rails/ActiveRecord/ConnectionAdapters/...
লি

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

আপনার টিনিটিডস রত্ন ইনস্টল করা দরকার, যেহেতু আপনি আপনার প্রশ্নে এটি নির্দিষ্ট করেননি আমি সক্রিয় রেকর্ডটি ব্যবহার করি নি


1
অবশ্যই, টিনিটিডস হ'ল সম্পূর্ণ রত্ন .. এটি অ্যাক্টিভেকর্ড নয়। এটি ব্যবহার করার জন্য আপনার এটি পৃথকভাবে ইনস্টল করা উচিত।
ডেনিস-বু

1
মাইএসকিএল 2 এবং সক্রিয়-রেকর্ড পাওয়া পর্যন্ত আমি কোনও অতিরিক্ত জেএম ব্যবহার করতে চাই না
নীরেজ

ভাল, আপনার প্রশ্নের মধ্যে এটি উল্লেখ করা উচিত (ট্যাগ / শিরোনাম)
পিঁপড়া

2
টিনিটিডিএস এমএসএসকিউএল এবং সিবাসে কাজ করে, এটি মাইএসকিউএল নিয়ে কাজ করে না। পিপীলিকা: আপনি উল্লেখ করা উচিত আপনার উত্তর যে, এবং যে ওপি একই কুলুঙ্গি DBMS ব্যবহার করছে হিসাবে আপনি না অনুমান।
cliffordheath
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.