আপনি কিভাবে নুওডিবি ব্যবহার করে রুবি অন রেলগুলিতে ম্যানুয়ালি এসকিউএল কমান্ডগুলি সম্পাদন করবেন


142

আমি ম্যানুয়ালি এসকিউএল কমান্ডগুলি কার্যকর করার চেষ্টা করছি যাতে আমি নুওডিবিতে পদ্ধতিগুলি অ্যাক্সেস করতে পারি।

আমি রেলগুলিতে রেল ব্যবহার করছি এবং আমি নিম্নলিখিত কমান্ডটি ব্যবহার করছি:

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

"এসকিউএল ক্যোয়ারী" কোনও এসকিউএল কমান্ড হতে পারে।

উদাহরণস্বরূপ, আমার কাছে "ফিডব্যাক" নামে একটি টেবিল রয়েছে এবং যখন আমি কমান্ডটি কার্যকর করি:

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

এটি কেবল আমাকে অনুরোধ করা সমস্ত ডেটা প্রেরণের পরিবর্তে "সত্য" প্রতিক্রিয়া ফিরিয়ে আনবে।

এটিই রেলস কনসোলের আউটপুট:

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

আমি এটিকে নুওডিবিতে সঞ্চিত প্রক্রিয়াগুলি কল করতে ব্যবহার করতে চাই তবে পদ্ধতিগুলি কল করার পরে এটি একটি "সত্য" প্রতিক্রিয়াও ফিরে আসবে।

যেভাবেই কি আমি এসকিউএল কমান্ডগুলি কার্যকর করতে এবং "সত্য" প্রতিক্রিয়া পাওয়ার পরিবর্তে অনুরোধ করা ডেটা পেতে পারি?

উত্তর:


166

কাস্টম এসকিউএল স্টেটমেন্টগুলি কার্যকর করতে আমি যে ওয়ার্কিং কমান্ডটি ব্যবহার করছি তা হ'ল:

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

"foo" এর সাথে স্কিল স্টেটমেন্ট হচ্ছে (যেমন "সারণী থেকে নির্বাচন করুন")।

এই কমান্ডটি হ্যাশ হিসাবে মানগুলির একটি সেট ফেরত দেবে এবং ফলাফলগুলি পরিবর্তনশীলে রাখবে।

সুতরাং আমার রেলগুলিতে প্রয়োগ_কন্ট্রোলআরআরবি আমি এটি যুক্ত করেছি:

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

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

এক্সিকিউট_স্টেটমেন্ট ব্যবহার করে পাওয়া রেকর্ডগুলি ফিরে আসবে এবং যদি কিছু না থাকে তবে এটি শূন্য হবে return

এইভাবে আমি এটি রেল অ্যাপ্লিকেশনটিতে যে কোনও জায়গায় কল করতে পারি যেমন উদাহরণস্বরূপ:

records = execute_statement("select * from table")

"এক্সিকিউট_স্টেটমেন্ট" নুওডিবি পদ্ধতি, ফাংশন এবং ডেটাবেস ভিউগুলিকেও কল করতে পারে।


3
আপনি পিএসকিউএল এ থাকলে এক্সিকিউটি কিউরি ব্যবহার করা ভাল কারণ এটি মেমরি ফাঁস করবে
23 ইনিউজ

3
আমি আপনার প্রশ্নের এবং আপনার উত্তরের কোডের মধ্যে পার্থক্য খুঁজে পাচ্ছি না। তারা উভয় ব্যবহার মনে হয় ActiveRecord::Base.connection.execute। আপনি দয়া করে ঠিক কি ঠিক পরিবর্তে তথ্য পেতে আপনি কি পরিবর্তন করতে পারেন নির্দেশ করতে পারেন true?
রকেটআর

119

আমার জন্য, আমি এটি একটি হ্যাশ ফেরত পেতে পারি না।

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

তবে এক্সিকিউটি-কোয়েরি পদ্ধতি ব্যবহার করে কাজ হয়েছে।

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

10
.exec_queryActiveRecord::Resultসহজেই অ্যাক্সেসযোগ্য .columnsএবং .rowsগুণাবলী সহ খুব সহজেই এমন কোনও বস্তু ফেরত দেয় । .executeহ্যাশগুলির একটি অ্যারে ফেরত দেয় যা সাধারণত মোকাবেলা করার জন্য আরও বেশি ঝামেলার এবং স্মৃতিতে সম্ভবত ভারী। আমি কখনও ব্যবহার করিনি exec_query, টিপটির জন্য ধন্যবাদ।
ফ্রেঞ্চিও রডরিগস

9
কেবলমাত্র সর্বশেষ মন্তব্যে যুক্ত করতে, আপনি সাধারণত হ্যাশগুলির অ্যারে হিসাবে ফলাফলগুলি .entriesব্যবহার .exec_queryকরার সময় ব্যবহার করতে চান।
8 ই

এটি সর্বদা আমাকে অ্যাক্টিভেকর্ড 5 ডিফল্ট কোয়েরি চালিয়ে ফলাফলের জন্য শূন্য করে?
টম রসি

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
আপনি কেন সংযোগ পুলের পরিবর্তে সংযোগ পুলটি ব্যবহার করবেন? কোন সুবিধা আছে? আপনি এটি সম্পর্কে একটি উত্স আছে?
Bonafernando

3
@ ব্রাফানান্দো, আপনার ডাটাবেসটিতে "প্রচুর সংযোগ" ত্রুটি ছোঁড়া শুরু হতে পারে যদি আপনার কোড রয়েছে যা ActiveRecord::Base.connectionকল না করে ব্যবহার করে ActiveRecord::Base.clear_active_connections!। দেখুন api.rubyonrails.org/v5.2/class/AtivetiveRecord/…
ইরিমাইট

হ্যাঁ, আপনার উত্তরের আগে আমি পরিবর্তন করেছি এবং লক্ষ্য করেছি যে আমার আর কোনও "খুব বেশি সংযোগ" ত্রুটি কখনও হয়নি। ধন্যবাদ!
Bonafernando
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.