我在我的Ruby应用程序中使用SQLite + ActiveRecord,这是我在尝试向整数字段写入一个大数字时得到的错误:
1428584647765超出了ActiveRecord :: Type :: Integer的范围 限制4
但根据SQLite文档:
该值是有符号整数,存储为1,2,3,4,6或8个字节,具体取决于值的大小。
8个字节是存储整数1428584647765的足够空间,那么为什么ActiveRecord会给我一个错误?为什么它认为这是一个4字节的字段?
答案 0 :(得分:34)
我遇到了同样的问题,上面的答案给了我一个如何修理我的线索。我提出了一些解决问题的答案。
您可以通过设置表格列的限制来执行此操作。
<强>哈克/步骤强>
运行迁移以更改表列。 e.g。
rails generate migration change_integer_limit_in_your_table
注意:代码中的your_table
将是您的复数表格
编辑生成的迁移,使生成的迁移如下所示:
class ChangeIntegerLimitInYourTable < ActiveRecord::Migration
def change
change_column :your_table, :your_column, :integer, limit: 8
end
end
注意:代码中的限制为8是存储大小,范围从-9223372036854775808到+9223372036854775807,并且称为bigint
,即大范围整数。
运行rake db:migrate
以迁移您的数据库。
运行rails server
重新启动服务器,您就可以运行了。
有关数字类型的详细信息,请参阅https://www.postgresql.org/docs/9.4/static/datatype-numeric.html
答案 1 :(得分:15)
美好的一天。 默认情况下,列创建为len = 32字节
要进行更改,您可以创建迁移,例如:
t.integer :some_field, :limit => 8
答案 2 :(得分:0)
我今天也偶然发现了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