NuoDBを使用してRuby On RailsでSQLコマンドを手動で実行する方法


142

NuoDBのプロシージャにアクセスできるように、SQLコマンドを手動で実行しようとしています。

Ruby on Railsを使用しており、次のコマンドを使用しています。

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

「SQLクエリ」は、任意のSQLコマンドです。

たとえば、「フィードバック」というテーブルがあり、コマンドを実行すると次のようになります。

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

これは、要求されたすべてのデータを私に送信するのではなく、「真の」応答のみを返します。

これはRailsコンソールの出力です:

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

これを使用してNuoDBのストアドプロシージャを呼び出したいのですが、プロシージャを呼び出すと、 "true"応答も返されます。

とにかく、SQLコマンドを実行して、「真の」応答を取得する代わりに、要求されたデータを取得できますか?

回答:


166

カスタムSQLステートメントを実行するために使用している作業コマンドは次のとおりです。

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

"foo"はSQLステートメントです(つまり "SELECT * FROM table")。

このコマンドは、値のセットをハッシュとして返し、それらを結果変数に入れます。

だから私のレールapplication_controller.rbにこれを追加しました:

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

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

execute_statementを使用すると、見つかったレコードが返され、ない場合はnilが返されます。

このようにして、たとえば次のようなRailsアプリケーションの任意の場所で呼び出すことができます。

records = execute_statement("select * from table")

"execute_statement"は、NuoDBのプロシージャ、関数、およびデータベースビューも呼び出すことができます。


3
メモリをリークするため、PSQLを使用している場合はexec_queryを使用することをお勧めします
23inhouse

3
質問と回答のコードの違いはわかりません。どちらも使用しているようですActiveRecord::Base.connection.execute。単にデータを取得するのではなく、正確に何を変更してデータを取得するかを教えていただけませtrueんか?
RocketR

119

私にとっては、これを取得してハッシュを返すことができませんでした。

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

しかし、exec_queryメソッドを使用するとうまくいきました。

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

10
.exec_query返すActiveRecord::Result簡単にアクセスできると非常に便利であるオブジェクト.columns.rows属性を。.executeハッシュの配列を返します。これは通常、処理がより面倒であり、おそらくメモリが重いです。exec_queryチップをありがとう、私は使ったことがない。
フランシオロドリゲス2017

9
最後のコメントに追加するために、通常はを使用.entriesして.exec_query結果をハッシュの配列として取得する場合に使用します。
8bithero、2018年

これは常に、DELETEクエリを実行するActiveRecord 5の結果に対して私にnilを与えますか?
トム・ロッシ

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. データベース接続で任意のSQLを実行する
  2. その後、接続を接続プールに戻す

2
接続自体の代わりに接続プールを使用するのはなぜですか?何か利点はありますか?それについての情報源はありますか?
bonafernando

3
@bonafernando、を呼び出さずに使用するコードがある場合、データベースが「Too many connections」エラーをスローし始める可能性があります。api.rubyonrails.org/v5.2/classes/ActiveRecord/…を参照してくださいActiveRecord::Base.connectionActiveRecord::Base.clear_active_connections!
eremite

ええ、あなたの答えの前に私は変更し、他の「接続が多すぎます」というエラーは一度もないことに気づきました。ありがとう!
bonafernando
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.