ActiveRecord执行原始sql没有返回任何结果?

时间:2013-12-30 04:04:17

标签: ruby-on-rails activerecord

ActiveRecord::Base.connection.execute "SELECT sometable.* from sometable limit 10"
   (76.1ms)  SELECT sometable.* from sometable limit 10
=> #<PG::Result:0x007fbd99647608
 @connection=
  #<PG::Connection:0x007fbd9ac05fa8
   @notice_processor=nil,
   @notice_receiver=nil,
   @socket_io=nil>>

不确定为什么没有返回结果。肯定有一个活动的连接,我能够使用正常的ActiveRecord查询接口查询数据库。但是当我切换到原始sql时,我遇到了上述问题

2 个答案:

答案 0 :(得分:13)

Mysql2::ResultPG::Result对象有一个each方法来迭代结果

ActiveRecord::Base.connection.execute("SELECT sometable.* from sometable limit 10").each |row|
  p row
end

注意:您无法像数组一样访问结果。需要使用each方法

 array = ActiveRecord::Base.connection.execute("SELECT sometable.* from sometable limit 10")
 array[0] # This will not work

如果您想要select_all

中的结果,请尝试Array
ActiveRecord::Base.connection.select_all "SELECT sometable.* from sometable limit 10"

答案 1 :(得分:3)

您所看到的是从postgresql数据库返回的结果:PostGresResult。 (因此&#34; PG)pg gem是你如何连接数据库。 Here's the wiki for the PG gem. &#39;&#39; gem doc(和相关的libpg)提供了有关与Postgresql数据库交互的细节的所有令人兴奋的细节。

PG::PGResult现在称为PG::ResultThe documentation for PG::Result is here.

@shiva是对的:对于Postgres,结果不是数组。 (其他数据库显然确实从这些调用中返回了数组)。但是PG::Result类具有迭代每一行,转换为哈希等的方法。 (这就是@shiva所暗示的。)查看上面的文档链接。

您可能需要将require 'pg'放入特定的源文件中,具体取决于您的项目和方式。开发环境的建立。 (由于您可以连接到数据库,因此已经安装了pg gem。)

以下是PG::Result文档页面中的概述和示例:

  

PG::Result(别名= PGResult

     

表示查询结果元组(行)的类。一个例子   此类是作为每个查询的结果创建的。你可能需要   完成结果后调用实例的#clear方法   为了更好的记忆表现。

     

示例:

require 'pg'
conn = PGconn.open(:dbname => 'test')
res  = conn.exec('SELECT 1 AS a, 2 AS b, NULL AS c')
res.getvalue(0,0) # '1'
res[0]['b']       # '2'
res[0]['c']       # nil

稍微阐述一下这个例子:

上面的示例返回一行(index = 0),其中包含三列。第一列是&#39; a&#39;还有另一个名为&#39; b&#39;第三栏被称为“c&#39;”。您可以将第一行第一列的值设为:

res.getvalue(0,0)

它将返回值&#39; 1&#39;

您可以将第一行第二列的值设为:

res[0]['b']

它将返回值&#39; 2&#39;

示例的第三行使用相同的方法来获取列的值&#39; c&#39;对于第一行(返回值nil)。

当然,您可以使用PG::Result

中更易阅读的方法