2014-05-05 119 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

相關問題