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

Posted

技术标签:

【中文标题】如何使用 NuoDB 在 Ruby On Rails 中手动执行 SQL 命令【英文标题】:How do you manually execute SQL commands in Ruby On Rails using NuoDB 【发布时间】:2014-05-10 06:32:51 【问题描述】:

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

我正在使用 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 命令并获取请求的数据而不是得到“真实”响应?

【问题讨论】:

【参考方案1】:

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

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

“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

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

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

records = execute_statement("select * from table")

“execute_statement”还可以调用 NuoDB 过程、函数,也可以调用数据库视图。

【讨论】:

如果你在 PSQL 上最好使用 exec_query,因为它会泄漏内存 我找不到您的问题和答案中的代码之间的区别。他们似乎都使用ActiveRecord::Base.connection.execute。您能否指出您为获取数据所做的具体更改而不仅仅是true【参考方案2】:

对我来说,我无法让它返回一个哈希值。

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

但是使用 exec_query 方法有效。

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

【讨论】:

.exec_query 返回一个ActiveRecord::Result 对象,该对象非常方便,具有易于访问的.columns.rows 属性。 .execute 返回一个散列数组,通常处理起来更麻烦,而且内存可能更重。我从来没有用过exec_query,谢谢你的提示。 只是添加到最后一条评论,您通常希望在使用 .exec_query 时使用 .entries 以将结果作为哈希数组获取。 ActiveRecord 5 运行 DELETE 查询时,结果总是为零?【参考方案3】:

从我们的论坛转发答案以帮助其他有类似问题的人:

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

【讨论】:

【参考方案4】:
res = ActiveRecord::Base.connection_pool.with_connection  |con| con.exec_query( "SELECT 1;" ) 

上面的代码是一个例子

    在您的数据库连接上执行任意 SQL 之后将连接返回到连接池

【讨论】:

为什么要使用连接池而不是连接本身?有什么优势吗?你有它的来源吗? @bonafernando,如果您的代码使用ActiveRecord::Base.connection 而不调用ActiveRecord::Base.clear_active_connections!,您的数据库可能会开始抛出“连接过多”errors。见api.rubyonrails.org/v5.2/classes/ActiveRecord/… 是的,在您回答之前,我已经更改并注意到我从未遇到任何其他“连接过多”错误。谢谢!【参考方案5】:

一旦你得到 mysql::Result 对象

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

您可以将其转换为行数组

results.to_a

将制作这种格式的数组

[[row1][row2]...]

【讨论】:

以上是关于如何使用 NuoDB 在 Ruby On Rails 中手动执行 SQL 命令的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails 上的免费融合图表

ruby on rails 中的引导模式不起作用(不显示)

每当我使用 `npm start` 启动我的应用程序时,它会将我带到 Ruby on Rails 主屏幕,而不是我的 index.html 文件

如何为 ruby​​ 2.7.1 解决 AWS Elastic Beanstalk 上的 Rail 6 部署错误

/usr/bin/env ruby​​ 没有这样的文件或目录:使用 capistrano 3、capistrano/rbenv、capistrano/bundler 和 capistrano/rail

rails是啥意思