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时,我遇到了上述问题
答案 0 :(得分:13)
Mysql2::Result
或PG::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::Result
。 The 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