2014-05-05 68 views
2

切换一个滑轨应用程序从MySQL到的Postgres提供了以下错误:交换MySQL来Postgres的:“列必须出现在GROUP BY子句或在聚合函数可以使用”

ERROR: column "contacts.id" must appear in the GROUP BY clause or be used in an aggregate function 

以下是在范围问题:

class User < MyModel 
    def self.top_contacts(timeframe = 1.week.ago, limit = 5) 
    Contact.unscoped 
      .where('created_at between ? and ?', timeframe, Time.now) 
      .group(:user_id) 
      .order('sum(score) DESC') 
      .limit(limit) 
      .includes(:user) 
      .collect{|x| x.user} 
    end 
end 
  1. 如何解决这一问题?
  2. 不使用Rails作为数据库抽象层确保切换数据库应该无缝工作?

回答

2

问题出在你的ORM层不可见的SQL级别上。这个问题与RoR ORM完全相同,因为它似乎会生成一个MySQL友好的查询,它使用MySQL的非常特性,即postgresql没有的特性。

的快速解决方案:给contacts.id由您是GROUP-ING以及列:

.group("user_id, contacts.id"); 
+0

有是可以在一个地方做了更加持久的解决方案(如配置也许)或改变所有查询来做到这一点是唯一的方法? – user3188544

+0

@ user3188544谢谢! RoR必须有一些关于使用的SQL方言的标志或设置。这可能是一种方式。另一种方法可能是如果您仅选择实际列,或者您使用聚合查询(例如,“MIN(列名)”作为列名)。 – peterh

相关问题