【问题标题】:Rails: ActiveRecord::UnknownPrimaryKey exceptionRails:ActiveRecord::UnknownPrimaryKey 异常
【发布时间】:2012-11-13 21:20:16
【问题描述】:
A ActiveRecord::UnknownPrimaryKey occurred in survey_response#create:

Unknown primary key for table question_responses in model QuestionResponse.
activerecord (3.2.8) lib/active_record/reflection.rb:366:in `primary_key'

我们的应用程序一直在引发这些异常,我们不知道是什么导致了它们。该异常发生在生产环境和测试环境中,但在任何一个环境中都不可重现。 似乎与服务器负载有某种关系,但即使在负载高峰期,一些请求仍能成功完成。该应用程序(生产和测试环境)是 Rails 3.2.8,ruby 1.9.3-p194,使用 MySQL 和 mysql2 gem。生产环境是 Ubuntu,开发/测试是 OS X。该应用程序在生产环境中的 Phusion Passenger 下运行。

这是一个示例堆栈跟踪:https://gist.github.com/4068400
这是有问题的两个模型,控制器和“desc question_responses;”的输出:https://gist.github.com/4b3667a6896b60383dc3
它肯定有一个主键,它是一个标准的 rails 'id' 列。

重新启动应用程序服务器会暂时停止异常的发生,否则它们会在 30 分钟到 6 小时的时间段内发生,开始时突然停止。

它总是发生在同一个控制器动作、表和模型上。

还有其他人遇到过这个异常吗?

【问题讨论】:

  • 请发布您的模型和控制器。
  • 已添加。我们还注意到,只有少数乘客工作人员会产生异常。会不会是架构缓存的问题?
  • 我注意到您在失败的模型中使用了primary_key = 'id'。是在遇到问题后添加的吗?否则我建议你测试不同的东西 1. 去掉这条线(rails 默认使用'id',2. 使用set_primary_key 'id' 代替(至少在旧的 Rails 中使用过),3. 或许可以尝试使用 :id而不是“id”。或者您可能已经测试了所有这些。

标签: mysql ruby-on-rails ruby activerecord


【解决方案1】:

FWIW,我遇到了同样的间歇性错误,经过一番摸索后,我找到了原因。

我们每个客户端都有单独的数据库,并且某些客户端的数据库在用户表上缺少主键。这意味着当该客户端访问我们的站点时,Rails 将其内存模式更新为它所连接的数据库的模式,但缺少主键。无论该特定数据库是否具有主键,该乘客应用程序进程(或任何其他已被该客户端“感染”的)尝试访问用户表的任何未来请求都会因主键错误而中断。

最后是一个不言自明的错误,但是当您有 500 多个数据库并且只有一个数据库导致问题时很难确定,而且它是间歇性的。

【讨论】:

    【解决方案2】:

    遇到这个问题是因为我的工作人员使用了与数据库的共享连接。但我是独角兽。

    我知道Passenger默认会重新连接,但也许你有一些复杂的逻辑。例如,与多个数据库的连接。所以你需要重新连接所有的连接。

    【讨论】:

      【解决方案3】:

      同样的事情也发生在我身上。我的一个表定义中有一个复合主键导致错误。由于注释模型不(但很快/现在)不支持复合主键的注释,因此更加复杂。

      我的解决方案是使 id 列成为唯一的主键,并为组合添加一个约束(未显示)。为此,您需要在 id 上删除 auto_increment(如果已设置),删除复合主键,然后重新添加主状态和自动增量。

      ALTER TABLE indices MODIFY id INT NOT NULL;
      ALTER TABLE indices DROP PRIMARY KEY;
      ALTER TABLE indices MODIFY id INT NOT NULL PRIMARY KEY AUTO_INCREMENT;
      

      【讨论】:

        【解决方案4】:

        在 postgres 数据库上

        ALTER TABLE indices ALTER COLUMN id SET DATA TYPE INT;
        ALTER TABLE indices ADD PRIMARY KEY (id)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-02-07
          • 1970-01-01
          • 2017-05-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多