ruby 尝试保存大整数值时,出现错误,指出数字“超出ActiveRecord::Type::Integer的范围,限制为4”

wljmcqd8  于 2022-11-29  发布在  Ruby
关注(0)|答案(3)|浏览(135)

我在Ruby应用程序中使用SQLite + ActiveRecord,当我尝试向整数字段写入一个大的数字时,出现了以下错误:
1428584647765超出ActiveRecord::Type::整数的范围,限制为4
但根据SQLite文档:
该值是一个有符号整数,根据值的大小存储在1、2、3、4、6或8个字节中。

8个字节足够存储整数1428584647765,那么为什么ActiveRecord给予我一个错误?为什么它认为这是一个4字节的字段?

huwehgph

huwehgph1#

我遇到了同样的问题,上面的答案给了我一个如何解决我的问题的线索。
您可以通过对表列设置限制来实现此目的。

黑客/步骤

1.运行迁移以更改表列。例如
rails generate migration change_integer_limit_in_your_table

注意:代码中的your_table将是您的表名的复数形式

1.编辑生成的迁移,使生成的迁移如下所示:

class ChangeIntegerLimitInYourTable < ActiveRecord::Migration
   def change
     change_column :your_table, :your_column, :integer, limit: 8
   end 
 end

:代码中8的限制是存储大小,范围为-9223372036854775808到+9223372036854775807,称为bigint,即大范围整数。

1.运行rake db:migrate迁移数据库。
1.通过运行rails server重新启动服务器,您就可以启动并运行了。
有关数字类型的详细信息,请参阅https://www.postgresql.org/docs/9.4/static/datatype-numeric.html

41ik7eoe

41ik7eoe2#

日安。默认情况下,创建长度为32字节的列
要更改此设置,可以创建迁移,例如:

t.integer :some_field, :limit => 8
9wbgstp7

9wbgstp73#

我今天在PostgreSQL上也偶然发现了这个问题。我知道这个问题很老了,作者也在使用SQLite,但是因为很多人似乎都像我一样在这里结束了,所以让我发布了一个更新的解决方案。
对于Rails 5.1(我相信是4.1及更高版本,但没有测试)和PostgreSQL(可能还有其他数据库),正确的方法是将列类型设置为bigint,使用limit: 8选项不会影响数据库。
这是使用名为products的数据表和名为quantity的数据行的范例程式码:

class ChangeProductsQuantityToBigint < ActiveRecord::Migration[5.1]
  def change
    change_column :products, :quantity, :bigint
  end
end

相关问题