【问题标题】:Rails with Postgres data is returned out of order带有 Postgres 数据的 Rails 乱序返回
【发布时间】:2013-01-23 04:28:31
【问题描述】:

我刚刚将我的应用程序从 MySQL 转换为 Postgres。以前,对 .all 的请求会按 id 顺序返回所有行。在 Postgres 上,行被乱序返回。同样,

Person.first

以前返回id为1的记录,现在有时返回另一个记录。

如果我添加这样的订单子句:

Person.order("id").first

查询成功并返回第一行。这是预期的行为吗?

【问题讨论】:

  • “让我觉得恶心”有一个已知的排序(从你的应用程序中删除一个错误)与随机排序(并保留错误)???
  • MySQL 默认按 id 排序。这是一个合理的假设。
  • 我认为 InnoDB 按主键排序是其实现的副作用。其他存储引擎的行为不同,我不确定 Oracle 是否会保证将来的顺序保持不变。 SQL 标准非常清楚结果集的顺序是未定义的,除非您明确要求。
  • 好的,很公平。如果我修改问题,您会否决否决票?

标签: mysql ruby-on-rails postgresql rails-activerecord


【解决方案1】:

this post 回答您的问题:

我认为默认情况下不能保证按 ID 排序,因为我相信如何返回无序查询取决于数据库。您可以通过在模型顶部定义默认范围来对其进行排序,如下所示:

default_scope order('id ASC')

那么调用 Model.all 就相当于调用 Model.order('id ASC')。

【讨论】:

  • 默认范围将覆盖查询链中的其他范围。这不是我的首选解决方案。
  • 另一种方法是创建一个范围,以便您可以使用 Person.by_id.first
  • 我想这就是要走的路。谢谢
  • 如果您选择在 Rail 4.2.0(可能更早版本)中使用它,您需要将范围放在像 default_scope { order('id ASC') } 这样的块中。
  • @superluminary 有没有关于这个的网页?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多