【问题标题】:ActiveRecord Uniqueness Constraint Returning Record Exists When It Doesn'tActiveRecord 唯一性约束返回记录存在时不存在
【发布时间】:2015-03-28 02:01:05
【问题描述】:

我得到这个输出:

Patient Exists (0.3ms)  SELECT 1 AS one FROM "patients" WHERE "patients"."chrono_id" = 5668276 LIMIT 1

我知道不存在具有该编号的 chrono_id 的患者记录,但我还是去控制台检查了。

Patient.where(chrono_id: 5668276)
Patient Load (0.5ms)  SELECT "patients".* FROM "patients" WHERE "patients"."chrono_id" = 5668276
 => #<ActiveRecord::Relation []>

控制台同意我的观点。

我的模型验证看起来像

validates_uniqueness_of :chrono_id, :allow_blank => true, :allow_nil => true

如果我尝试在控制台中创建病人,我会得到同样的错误

Patient.create(chrono_id: 5668276, first_name: "a", last_name: "a", dob: "1988/12/11")
   (0.2ms)  BEGIN
  Patient Exists (0.4ms)  SELECT 1 AS one FROM "patients" WHERE "patients"."chrono_id" = 5668276 LIMIT 1

这令人放心,因为至少这意味着它不是环境问题。

我尝试重新创建返回结果的确切 sql 请求,以便我可以看到结果并弄清楚它是何时/如何创建的

a = ActiveRecord::Base.connection.select_all("SELECT 1 AS one FROM patients WHERE patients.chrono_id = 5668276 LIMIT 1")
   (0.4ms)  SELECT 1 AS one FROM patients WHERE patients.chrono_id = 5668276 LIMIT 1

 => #<ActiveRecord::Result:0x007fe0d343f650 @columns=["one"], @rows=[], @hash_rows=nil, @column_types={"one"=>#<ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::OID::Integer:0x007fe0cef8bcc0>}>

没有返回行值,所以我仍然感到困惑。有什么想法吗?

更新

我有一个错字,将其他必填字段之一输入为 nil。由于某种原因,Activerecord 错误并没有告诉我这个字段有问题,而是抛出了这个 unique_record 问题。

更新 2 日志中的完整消息是

   (0.1ms)  BEGIN
  Patient Exists (0.9ms)  SELECT 1 AS one FROM "patients" WHERE "patients"."chrono_id" = 5669845 LIMIT 1
   (0.2ms)  ROLLBACK

【问题讨论】:

  • 只是为了澄清一个可能的误解,发送到日志文件的以“Patient Exists (0.3ms) SELECT 1 AS ...”开头的行只是注意到用于检测的查询的执行唯一性违规,而不是检测到违规。如果检测到违规,则可能会跟随另一行以 ms 为单位的计时和“ROLLBACK”。如果没有 ROLLBACK,那么我怀疑 Patient chorine_id 上的唯一性验证不是原因。
  • 感谢您的澄清;抱歉,我不太清楚下一行是回滚,这就是为什么我认为上一行是错误消息。我没有意识到这只是发生检查的日志。在我看来,那时可能根本没有传递任何错误消息,只是宣布回滚。这看起来是正确的还是回滚总是有相关的记录错误?
  • ROLLBACK 的存在通常是我在确定基于数据库 (?) 验证失败的原因时所寻找的(而不是超出范围的数字,或者在 Rails 中可检测到的峰值)。它通常还准确地展示了正在进行的检查——例如,是否有适用于唯一性验证的范围。如果有记录的错误语句,它可能会出现在下面(“ActiveRecord::RecordInvalid(验证失败:名称已被采用,代码已被采用)”......那种事情)但不确定这是否总是案例——可能取决于版本?
  • 作为数据库类型的人,检查 SQL 可能比大多数人更吸引我 -- stackoverflow.com/questions/16937390/…

标签: activerecord


【解决方案1】:

我有一个错字,将其他必填字段之一输入为 nil。对我原始帖子的评论指出,我引用的“错误”实际上只是运行唯一性检查的日志,而不是尽管下一行是回滚,但它返回了正数。

如果遇到类似问题,我鼓励任何人阅读主帖中的 cmets。如果被发帖人总结为答案,我会选择它作为问题的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 2016-08-10
    • 1970-01-01
    • 2022-01-17
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多