jpw*_*ynn 1 sql postgresql heroku
我的rails 3 app需要使用SELECT DISTINCT(据我所知)无法使用activerecord查询.所以我一直在执行直接SQL,它在sqllite本地运行正常 - 但它在Heroku(postgres)失败了.
在我的本地(sqllite)应用程序中,这很好用:
r = ActiveRecord::Base.connection.execute("my query string")
Run Code Online (Sandbox Code Playgroud)
但是在heroku上,使用ActiveRecord :: Base.connection.exe,ALWAYS会返回一个空的数据集
#<PGresult:0x0000000xxxxxxxxx>
Run Code Online (Sandbox Code Playgroud)
即使是非常简单的查询,例如
r = ActiveRecord::Base.connection.execute("SELECT numeric_score FROM beeps WHERE store_id = '132' AND survey_num = '2'")
Run Code Online (Sandbox Code Playgroud)
因此,我正在使用heroku console
调试一些非常基本的SQL查询来尝试了解如何重新格式化我的SQL以在Heroku/Postgres中工作.
SELECT column_name WORKS:heroku控制台,选择postgres记录没问题,例如这样可以正常工作:
n = Beep.find_by_sql("SELECT numeric_score FROM beeps WHERE store_id = '132' AND survey_num = '2'")
Run Code Online (Sandbox Code Playgroud)
给出了预期的三个值:
[#<Beep numeric_score: 10>, #<Beep numeric_score: 9>, #<Beep numeric_score: 8>]
Run Code Online (Sandbox Code Playgroud)
但是SELECT COUNT
失败了?当我尝试在SQL中对它们进行COUNT时
n = Beep.find_by_sql("SELECT COUNT(*) FROM beeps WHERE store_id = '132' AND survey_num = '2'")
Run Code Online (Sandbox Code Playgroud)
它失败了,给出:
[#<Beep >]
Run Code Online (Sandbox Code Playgroud)
也SELECT SUM(column)
失败了?当我尝试SUM它们时
n = Beep.find_by_sql("SELECT SUM(numeric_score) FROM beeps WHERE store_id = '132' AND survey_num = '2'")
Run Code Online (Sandbox Code Playgroud)
它也失败了,给出:
[#<Beep >]
Run Code Online (Sandbox Code Playgroud)
如何使用Postgres执行直接SQL ... SUM(columnname)和COUNT(*)应该可以正常工作,对吧?
这里有几件事.
首先,find_by_sql
将根据返回的数据返回初始化对象,这就是为什么你没有看到任何从你的计数中回来的东西.
为了使用AR执行此操作,您可以执行以下操作:
Beep.where(:store_id => 123).where(:survey_num => 2).count
=> 5
Run Code Online (Sandbox Code Playgroud)
这将返回一个数字.总和是一样的:
Beep.where(:store_id => 123).where(:survey_num => 2).sum(:numeric_score)
=> 5
Run Code Online (Sandbox Code Playgroud)
您也可以使用与AR的区别,但它不是那么干净:
Beep.select("DISTINCT *").where(:store_id => 123).where(:survey_num => 2)
=> [<Beep>, <Beep>...etc]
Run Code Online (Sandbox Code Playgroud)
为了直接查询数据库,这仍然是可能的,你几乎就在那里:
conn = ActiveRecord::Base.connection
sql = "SELECT DISTINCT * FROM beeps WHERE store_ID = 123"
res = conn.execute sql
# res is now a PGResult object
res.each do |row|
puts row["id"]
puts row["numeric_score"]
end
Run Code Online (Sandbox Code Playgroud)