NuoDB kullanarak Ruby On Rails'de SQL komutlarını manuel olarak nasıl çalıştırıyorsunuz


142

NuoDB prosedürlerine erişebilmek için SQL komutlarını manuel olarak yürütmeye çalışıyorum.

Ruby on Rails kullanıyorum ve aşağıdaki komutu kullanıyorum:

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

"SQL sorgusu" herhangi bir SQL komutu olabilir.

Örneğin ben "Geribildirim" adlı bir tablo var ve ben komut yürütmek gibi:

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

Bu, bana istenen tüm verileri göndermek yerine yalnızca "doğru" bir yanıt döndürür.

Bu, Rails Console'daki çıktıdır:

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

Bu NuoDB saklı yordamlar çağırmak için kullanmak istiyorum ama yordamları çağırdıktan sonra, bu da "gerçek" bir yanıt dönecekti.

Yine de SQL komutları yürütmek ve "doğru" yanıt almak yerine istenen verileri alabilir miyim?

Yanıtlar:


166

Özel SQL ifadelerini yürütmek için kullandığım çalışma komutu:

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

"foo" sql ifadesidir (yani "SELECT * FROM tablosu").

Bu komut, bir değer kümesini karma olarak döndürür ve onları sonuç değişkenine yerleştirir.

Yani benim raylar üzerinde application_controller.rb Bunu ekledim:

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

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

Execute_statement kullanıldığında bulunan kayıtlar döndürülür ve eğer yoksa, sıfır döndürür.

Bu şekilde sadece raylar uygulamasında herhangi bir yere örneğin şöyle çağırabilirim:

records = execute_statement("select * from table")

"execute_statement" ayrıca NuoDB prosedürlerini, fonksiyonlarını ve Veritabanı Görünümlerini de çağırabilir.


3
PSQL kullanıyorsanız exec_query kullanmak daha iyidir, çünkü bellek sızdırır
23inhouse

3
Sorunuzdaki ve cevabınızdaki kod arasındaki farkı bulamıyorum. Her ikisi de kullanıyor gibi görünüyor ActiveRecord::Base.connection.execute. Verileri almak için tam olarak neyi değiştirdiğinizi belirtmek ister misiniz true?
RocketR

120

Benim için bunu bir karma döndürmek için alamadım.

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

Ancak exec_query yöntemini kullanarak çalıştı.

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

10
.exec_queryActiveRecord::Resultkolayca erişilebilir .columnsve .rowsnitelikleri ile çok kullanışlı bir nesne döndürür . .executegenellikle uğraşmak için daha zahmetli ve muhtemelen bellekte daha ağır olan bir karma dizisi döndürür. Hiç kullanmamıştım exec_query, bahşiş için teşekkürler.
Francio Rodrigues

9
Sadece geçen yoruma eklemek, genellikle kullanmak isterdim .entrieskullanırken .exec_querykarma bir dizi olarak sonuç almak için.
bithero

Bu her zaman bir DELETE sorgusu çalıştıran ActiveRecord 5 sonuçları için nil verir?
Tom Rossi

27

Benzer bir sorunla karşılaşan diğer kişilere yardımcı olmak için forumumuzun yanıtını yeniden yayınlamak

@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;" ) }

Yukarıdaki kod,

  1. veritabanı bağlantınızda rasgele SQL yürütme
  2. daha sonra bağlantıyı tekrar bağlantı havuzuna döndürme

2
Neden bağlantının kendisi yerine bağlantı havuzunu kullanacaksınız? Bir avantajı var mı? Bu konuda bir kaynağınız var mı?
bonafernando

3
@bonafernando, Arama yapmadan kullanılan kodunuz varsa veritabanınız "Çok fazla bağlantı" hatası atmaya başlayabilir . Bkz. Api.rubyonrails.org/v5.2/classes/ActiveRecord/…ActiveRecord::Base.connectionActiveRecord::Base.clear_active_connections!
eremite

Evet, cevabınızdan önce değiştim ve fark ettim, daha önce hiç "Çok fazla bağlantı" hatası olmadı. Teşekkürler!
bonafernando
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.