【问题标题】:updated ID column still failing with RangeError更新的 ID 列仍然因 RangeError 而失败
【发布时间】:2016-05-17 21:03:23
【问题描述】:

我的应用程序中有一个自动递增的 ID 字段,对于 mysql 中的中等 int,该字段已达到 2147483647 的上限。我收到以下错误:

RangeError: 2147483656 is out of range for ActiveRecord::Type::Integer with limit 4

我创建了一个迁移以使 ID 成为 bigint:

change_column :my_model_names, :id, :integer, limit: 8, auto_increment: true

这似乎奏效了 - 这是 mysql 命令行中对该字段的描述:

+-----------------------------+---------------+------+-----+---------+----------------+
| Field                       | Type          | Null | Key | Default | Extra          |
+-----------------------------+---------------+------+-----+---------+----------------+
| id                          | bigint(20)    | NO   | PRI | NULL    | auto_increment |
+-----------------------------+---------------+------+-----+---------+----------------+

在 rails 控制台中,当我查询 MyModelName.columns 时,我可以看到该列看起来正确:

2.2.2 :045 > MyModelName.columns[0]
> #<ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::Column:0x007f98bf6d6640 @strict=true, @collation=nil, @extra="auto_increment", @name="id", @cast_type=#<ActiveRecord::Type::Integer:0x007f98bf6e7490 @precision=nil, @scale=nil, @limit=8, @range=-9223372036854775808...9223372036854775808>, @sql_type="bigint(20)", @null=false, @default=nil, @default_function=nil>

它的 limit=8 和一个远远超过我试图保存的值的范围,但我仍然得到同样的错误:

2.2.2 :045 > MyModelName.new.save
RangeError: 2147483657 is out of range for ActiveRecord::Type::Integer with limit 4

有趣的是,自动增量值正在更新,即使记录没有保存。如果我再试一次,ID 值会增加:

RangeError: 2147483658 is out of range for ActiveRecord::Type::Integer with limit 4

版本信息

activerecord (4.2.5.1)
mysql2 (0.3.18)

【问题讨论】:

  • 愚蠢的问题:您是否尝试重新加载您的 Rails 控制台?
  • 是的 - 我什至重新启动了我的整个开发计算机。仍然得到相同的错误(除了它重置自动增量值 - 显然它存储在内存中)

标签: mysql ruby-on-rails activerecord


【解决方案1】:

是否有任何更新/after_save 回调将该值传播到需要调整大小的类似外键?

【讨论】:

  • 不,不是那样的。我无法在我刚刚创建的简化项目上重现该问题,因此我认为我们可能在某处有一个自定义函数,它覆盖了 mysql 适配器或活动记录中的方法。我将与团队中的另一位开发人员联系
  • 酷。希望你找到问题。更新线程,以便我也可以学习:)
  • 原来我的测试机器上有一条错误记录,该记录具有最大 ID,但我们的生产数据中实际上并没有那么多记录,因此将 ID 字段扩展到 bigint 是不必要。为什么我无法让新 ID 工作,这仍然是个谜。我现在在想,我的迁移在我运行它的前几次失败并且以某种方式损坏了 db 字段或自动增量。或者其他的东西。尴尬!
  • 哈!有些事情仍然是个谜:)很高兴事情解决了。
猜你喜欢
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 2020-07-08
  • 1970-01-01
  • 2020-08-11
相关资源
最近更新 更多