2014-03-31 23 views
58

我試圖手動執行SQL命令,以便我可以在NuoDB中訪問過程。如何在使用NuoDB的Ruby On Rails中手動執行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但在調用過程的存儲過程,這也將返回一個「真」響應。

是否有無論如何我可以執行SQL命令並獲取請求的數據而不是獲得「真實」的響應?

回答

84

我用來執行自定義的SQL語句工作的命令是:

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

與 「富」 是SQL語句(即 「SELECT * FROM表」)。

該命令將返回一組值作爲哈希值並將它們放入結果變量中。

所以在我的軌道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將返回找到的記錄,如果沒有,則返回零。

這樣我就可以把它像比如Rails應用程序的任何地方:

records = execute_statement("select * from table") 

「execute_statement」也可以撥打NuoDB過程,函數,也是數據庫視圖。

+3

如果你使用的是PSQL,最好使用exec_query,因爲它會泄漏內存 – 23inhouse

18

轉貼從我們論壇的答案,幫助其他有類似的問題:

@connection = ActiveRecord::Base.connection 
result = @connection.exec_query('select tablename from system.tables') 
result.each do |row| 
puts row 
end 
10
res = ActiveRecord::Base.connection_pool.with_connection { |con| con.exec_query("SELECT 1;") } 

上面的代碼是

  1. 數據庫連接
  2. 上執行任意的SQL的例子
  3. 之後將連接返回到連接池
+2

爲什麼要使用連接池而不是連接本身?有什麼優勢嗎?你會有一個關於它的消息來源嗎? – bonafernando

37

對我來說,我無法得到這個返回散列。

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

但是,使用exec_query方法工作。

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

'.exec_query'返回一個'ActiveRecord :: Result'對象,這個對象非常方便,可以方便地訪問'.columns'和'.rows'屬性。 '.execute'返回一個散列數組,這通常比較麻煩,而且可能在內存上更重。我從未使用'exec_query',感謝提示。 –