如何使用NuoDB在Ruby On Rails中手动执行SQL命令


142

我正在尝试手动执行SQL命令,以便可以访问NuoDB中的过程。

我正在使用Ruby on Rails,并且正在使用以下命令:

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

“ SQL查询”可以是任何SQL命令。

例如,我有一个名为“ Feedback”的表,执行命令时:

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

这只会返回“ true”响应,而不是向我发送所有请求的数据。

这是Rails Console上的输出是:

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

我想用它来调用NuoDB中的存储过程,但是在调用过程时,这也会返回“ true”响应。

无论如何,我可以执行SQL命令并获取请求的数据,而不是获得“真实”响应吗?

Answers:


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,谢谢。
Francio Rodrigues

9
仅添加到最后一条评论中,通常需要在使用哈希数组获取结果.entries时使用.exec_query
8bithero

这总是让我对ActiveRecord 5运行DELETE查询的结果一无所知吗?
汤姆·罗西

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,如果您使用的代码没有调用,则数据库可能会开始引发“连接过多” 错误。参见api.rubyonrails.org/v5.2/classes/ActiveRecord/…–ActiveRecord::Base.connectionActiveRecord::Base.clear_active_connections!
eremite

是的,在您回答之前,我已经更改并注意到我再也没有任何其他“连接过多”错误。谢谢!
bonafernando
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.