Bagaimana Anda secara manual menjalankan perintah SQL di Ruby On Rails menggunakan NuoDB


142

Saya mencoba untuk secara manual menjalankan perintah SQL sehingga saya dapat mengakses prosedur di NuoDB.

Saya menggunakan Ruby on Rails dan saya menggunakan perintah berikut:

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

"Permintaan SQL" bisa berupa perintah SQL apa saja.

Seperti misalnya saya memiliki tabel yang disebut "Umpan Balik" dan ketika saya menjalankan perintah:

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

Ini hanya akan mengembalikan respons "benar" daripada mengirimi saya semua data yang diminta.

Ini adalah output di Rails Console adalah:

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

Saya ingin menggunakan ini untuk memanggil prosedur tersimpan di NuoDB tetapi setelah memanggil prosedur, ini juga akan mengembalikan respons "benar".

Apakah ada cara untuk menjalankan perintah SQL dan mendapatkan data yang diminta alih-alih mendapatkan respons "benar"?

Jawaban:


166

Perintah kerja yang saya gunakan untuk menjalankan pernyataan SQL khusus adalah:

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

dengan "foo" menjadi pernyataan sql (yaitu "SELECT * FROM table").

Perintah ini akan mengembalikan satu set nilai sebagai hash dan memasukkannya ke dalam variabel hasil.

Jadi pada rail_ application_controller.rb saya menambahkan ini:

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

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

Menggunakan execute_statement akan mengembalikan catatan yang ditemukan dan jika tidak ada, itu akan mengembalikan nihil.

Dengan cara ini saya bisa menyebutnya di mana saja pada aplikasi rel seperti misalnya:

records = execute_statement("select * from table")

"execute_statement" juga dapat memanggil prosedur, fungsi, dan juga Tampilan Database NuoDB.


3
lebih baik menggunakan exec_query jika Anda menggunakan PSQL karena akan membocorkan memori
23inhouse

3
Saya tidak dapat menemukan perbedaan antara kode dalam pertanyaan Anda dan jawaban Anda. Keduanya sepertinya digunakan ActiveRecord::Base.connection.execute. Bisakah Anda menunjukkan apa yang sebenarnya Anda ubah untuk mendapatkan data, bukan hanya true?
RocketR

119

Bagi saya, saya tidak bisa mendapatkan ini untuk mengembalikan hash.

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

Tetapi menggunakan metode exec_query berhasil.

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

10
.exec_querymengembalikan ActiveRecord::Resultobjek yang sangat berguna dengan atribut yang mudah diakses .columnsdan .rows. .executemengembalikan array hash yang biasanya lebih sulit untuk ditangani dan mungkin lebih berat di memori. Saya belum pernah menggunakan exec_query, terima kasih atas tipnya.
Francio Rodrigues

9
Hanya untuk menambahkan komentar terakhir, Anda biasanya ingin menggunakan .entriesketika menggunakan .exec_queryuntuk mendapatkan hasil sebagai array hash.
8bithero

Ini selalu memberi saya nol untuk hasil dengan ActiveRecord 5 menjalankan query DELETE?
Tom Rossi

27

Reposting jawaban dari forum kami untuk membantu orang lain dengan masalah yang sama:

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

Kode di atas adalah contoh untuk

  1. mengeksekusi SQL sewenang-wenang pada koneksi database Anda
  2. mengembalikan koneksi kembali ke kolam koneksi sesudahnya

2
Mengapa Anda menggunakan kumpulan koneksi alih-alih koneksi itu sendiri? Apakah ada manfaatnya? Apakah Anda punya sumber tentang itu?
bonafernando

3
@bonafernando, Basis data Anda mungkin mulai melontarkan kesalahan "Terlalu banyak koneksi" jika Anda memiliki kode yang digunakan ActiveRecord::Base.connectiontanpa menelepon ActiveRecord::Base.clear_active_connections!. Lihat api.rubyonrails.org/v5.2/classes/ActiveRecord/...
pendeta

Ya, sebelum jawaban Anda, saya telah berubah dan menyadari bahwa saya tidak pernah memiliki kesalahan "Terlalu banyak koneksi" lainnya. Terima kasih!
bonafernando
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.