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

Pat*_*ung 125 sql activerecord ruby-on-rails-3 nuodb

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

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

ActiveRecord::Base.connection.execute("SQL query")
Run Code Online (Sandbox Code Playgroud)

"SQL查询"可以是任何SQL命令.

例如,我有一个名为"反馈"的表,当我执行命令时:

ActiveRecord::Base.connection.execute("SELECT `feedbacks`.* FROM `feedbacks`")
Run Code Online (Sandbox Code Playgroud)

这只会返回"真实"响应,而不是向我发送所有请求的数据.

这是Rails控制台上的输出是:

SQL (0.4ms)  SELECT `feedbacks`.* FROM `feedbacks`
 => true
Run Code Online (Sandbox Code Playgroud)

我想用它来调用NuoDB中的存储过程,但是在调用过程时,这也会返回一个"true"响应.

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

Pat*_*ung 148

我用来执行自定义SQL语句的工作命令是:

results = ActiveRecord::Base.connection.execute("foo")
Run Code Online (Sandbox Code Playgroud)

"foo"是sql语句(即"SELECT*FROM table").

此命令将返回一组值作为哈希值并将它们放入结果变量中.

所以在我的rails application_controller.rb上我添加了这个:

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

  if results.present?
    return results
  else
    return nil
  end
end
Run Code Online (Sandbox Code Playgroud)

使用execute_statement将返回找到的记录,如果没有,则返回nil.

这样我就可以在rails应用程序的任何地方调用它,例如:

records = execute_statement("select * from table")
Run Code Online (Sandbox Code Playgroud)

"execute_statement"也可以调用NuoDB过程,函数和数据库视图.

  • 如果你使用的是PSQL,最好使用exec_query,因为它会泄漏内存 (3认同)
  • 我无法找到问题代码和答案中的代码之间的区别.他们似乎都使用`ActiveRecord :: Base.connection.execute`.你能指出你改变了什么来获取数据而不仅仅是'true`吗? (2认同)

Tim*_*ark 102

对我来说,我无法让它返回哈希值.

results = ActiveRecord::Base.connection.execute(sql)
Run Code Online (Sandbox Code Playgroud)

但是使用exec_query方法有效.

results = ActiveRecord::Base.connection.exec_query(sql)
Run Code Online (Sandbox Code Playgroud)

  • `.exec_query`返回一个`ActiveRecord :: Result`对象,它非常方便,可以轻松访问`.columns`和`.rows`属性.`.execute`返回一个哈希数组,通常处理起来比较麻烦,内存可能更重.我从未使用过`exec_query`,谢谢你的提示. (8认同)
  • 只是为了添加到最后一条注释,当使用`.exec_query`将结果作为哈希数组时,通常需要使用`.entries`. (5认同)

小智 23

从我们的论坛中重新发布答案,以帮助其他人处理类似问题:

@connection = ActiveRecord::Base.connection
result = @connection.exec_query('select tablename from system.tables')
result.each do |row|
puts row
end
Run Code Online (Sandbox Code Playgroud)


And*_*iep 18

res = ActiveRecord::Base.connection_pool.with_connection { |con| con.exec_query( "SELECT 1;" ) }
Run Code Online (Sandbox Code Playgroud)

上面的代码是一个例子

  1. 在数据库连接上执行任意SQL
  2. 之后将连接返回到连接池

  • @bonafernando,你的数据库可能会开始抛出"Too many connections"[错误](https://dev.mysql.com/doc/refman/5.5/en/too-many-connections.html),如果你有使用`的代码ActiveRecord :: Base.connection`没有调用`ActiveRecord :: Base.clear_active_connections!`.见http://api.rubyonrails.org/v5.2/classes/ActiveRecord/ConnectionAdapters/ConnectionPool.html (3认同)
  • 为什么要使用连接池而不是连接本身?有什么优势吗?你有这方面的消息来源吗? (2认同)

小智 13

获得 MySql::Result 对象后

results = ActiveRecord::Base.connection.execute(query)
Run Code Online (Sandbox Code Playgroud)

您可以将其转换为行数组

results.to_a
Run Code Online (Sandbox Code Playgroud)

将制作这种格式的数组

[[row1][row2]...]
Run Code Online (Sandbox Code Playgroud)