Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite与Postgres中的Rails活动记录组查询_Sql_Ruby On Rails_Postgresql_Sqlite_Activerecord - Fatal编程技术网

SQLite与Postgres中的Rails活动记录组查询

SQLite与Postgres中的Rails活动记录组查询,sql,ruby-on-rails,postgresql,sqlite,activerecord,Sql,Ruby On Rails,Postgresql,Sqlite,Activerecord,我在SQLite vs Postgres中使用活动记录运行查询时出错。Postgres中存在聚合函数错误,但SQLite中没有。我的问题是,SQLite在这里做什么?是忽略了这个群体吗?请注意,GroupBySong不会返回错误 SQLite输出: Playlist.whereuser\u id:user.id.group:song 播放列表。其中user\u id:user.id.group:id,:song\u id Playlist.whereuser\u id:user.id.group

我在SQLite vs Postgres中使用活动记录运行查询时出错。Postgres中存在聚合函数错误,但SQLite中没有。我的问题是,SQLite在这里做什么?是忽略了这个群体吗?请注意,GroupBySong不会返回错误

SQLite输出: Playlist.whereuser\u id:user.id.group:song

播放列表。其中user\u id:user.id.group:id,:song\u id

Playlist.whereuser\u id:user.id.group:song.count

group by的一个常见规则:只能选择group by和AGGRATE函数中列出的列。这种方法受sql标准支持,可以在任何sql数据库中使用

如果您正在选择group by子句中未列出的列,例如select*…group by song_id,则它可能在某些数据库中工作,而在其他数据库中不工作

如果在代码中指定所选列,它将起作用:

Playlist.
  where(user_id:user.id).
  select("song_id").
  group(:song_id)

您可以在PostgreSQL文档中阅读有关group by的详细信息:

我已经研究了其他问题,但我的问题更侧重于SQLite正在做什么以及为什么要做它正在做的事情。它似乎忽略了SQL语句的group子句。我没有提到任何关于部署的事情。我只是在开发过程中切换到Postgres,因为我忘了在新rails上给它Postgres标志。我在问题中也有适当的聚合查询。
 Playlist Load (0.4ms)  SELECT "playlists"."id", "playlists"."user_id",
 "playlists"."song_id" FROM "playlists" WHERE "playlists"."user_id" = ?
 GROUP BY "song"  [["user_id", 1]]

  => #<ActiveRecord::Relation [#<Playlist id: 2, user_id: 1, song_id: 
  1, created_at: "2017-04-27 01:18:01">]>
 Playlist Load (0.2ms)  SELECT "playlists".* FROM "playlists" WHERE 
 "playlists"."user_id" = ? GROUP BY "playlists"."id", 
 "playlists"."song_id"  [["user_id", 1]]

 => #<ActiveRecord::Relation [#<Playlist id: 1, user_id: 1, song_id: 1, 
 created_at: "2017-04-27 01:18:00", updated_at: "2017-04-27 01:18:00">, 
 #<Playlist id: 2, user_id: 1, song_id: 1, created_at: "2017-04-27 
 01:18:01", updated_at: "2017-04-27 01:18:01">]> 
 (0.2ms)  SELECT COUNT(*) AS count_all, "playlists"."song_id" AS      
 playlists_song_id FROM "playlists" WHERE "playlists"."user_id" = ? 
 GROUP BY "playlists"."song_id"  [["user_id", 1]]

 Song Load (2.1ms)  SELECT  "songs".* FROM "songs" 
 WHERE "songs"."id" = ? LIMIT 1  [["id", 1]] 

 => {#<Song id: 1, title: "A song", artist: "Artist", user_id: 1, 
 created_at: "2017-04-27 01:17:39">=>2}
ActiveRecord::StatementInvalid: PG::GroupingError: ERROR:  column 
"playlists.id" must appear in the GROUP BY clause or be used in an 
aggregate function

SELECT "playlists".* FROM "playlists" WHERE "playlists"."user_id" = $1 
GROUP BY "playlists"."song_id"
 Playlist Load (0.6ms)  SELECT "playlists".* FROM "playlists" WHERE 
 "playlists"."user_id" = $1 GROUP BY "playlists"."id",      
 "playlists"."song_id"  [["user_id", 1]]

 => #<ActiveRecord::Relation [#<Playlist id: 1, user_id: 1, song_id: 1, 
 created_at: "2017-04-27 01:25:34", updated_at: "2017-04-27 01:25:34">, 
 #<Playlist id: 2, user_id: 1, song_id: 1, created_at: "2017-04-27 
 01:25:36", updated_at: "2017-04-27 01:25:36">]>
 (0.5ms)  SELECT COUNT(*) AS count_all, "playlists"."song_id" AS 
 playlists_song_id FROM "playlists" WHERE "playlists"."user_id" = $1 
 GROUP BY "playlists"."song_id"  [["user_id", 1]]

 Song Load (0.3ms)  SELECT  "songs".* FROM "songs" WHERE "songs"."id" = 
 $1 LIMIT 1  [["id", 1]]

 => {#<Song id: 1, title: "A song", artist: "Artist", user_id: 1, 
 created_at: "2017-04-27 01:25:26", updated_at: "2017-04-27           
 01:25:26">=>2}
Playlist.
  where(user_id:user.id).
  select("song_id").
  group(:song_id)