我在Ruby应用程序中使用SQLite + ActiveRecord,当我尝试向整数字段写入一个大的数字时,出现了以下错误:1428584647765超出ActiveRecord::Type::整数的范围,限制为4但根据SQLite文档:该值是一个有符号整数,根据值的大小存储在1、2、3、4、6或8个字节中。
8个字节足够存储整数1428584647765,那么为什么ActiveRecord给予我一个错误?为什么它认为这是一个4字节的字段?
huwehgph1#
我遇到了同样的问题,上面的答案给了我一个如何解决我的问题的线索。您可以通过对表列设置限制来实现此目的。
黑客/步骤
1.运行迁移以更改表列。例如rails generate migration change_integer_limit_in_your_table
rails generate migration change_integer_limit_in_your_table
注意:代码中的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,即大范围整数。
bigint
1.运行rake db:migrate迁移数据库。1.通过运行rails server重新启动服务器,您就可以启动并运行了。有关数字类型的详细信息,请参阅https://www.postgresql.org/docs/9.4/static/datatype-numeric.html
rake db:migrate
rails server
41ik7eoe2#
日安。默认情况下,创建长度为32字节的列要更改此设置,可以创建迁移,例如:
t.integer :some_field, :limit => 8
9wbgstp73#
我今天在PostgreSQL上也偶然发现了这个问题。我知道这个问题很老了,作者也在使用SQLite,但是因为很多人似乎都像我一样在这里结束了,所以让我发布了一个更新的解决方案。对于Rails 5.1(我相信是4.1及更高版本,但没有测试)和PostgreSQL(可能还有其他数据库),正确的方法是将列类型设置为bigint,使用limit: 8选项不会影响数据库。这是使用名为products的数据表和名为quantity的数据行的范例程式码:
limit: 8
class ChangeProductsQuantityToBigint < ActiveRecord::Migration[5.1] def change change_column :products, :quantity, :bigint end end
3条答案
按热度按时间huwehgph1#
我遇到了同样的问题,上面的答案给了我一个如何解决我的问题的线索。
您可以通过对表列设置限制来实现此目的。
黑客/步骤
1.运行迁移以更改表列。例如
rails generate migration change_integer_limit_in_your_table
注意:代码中的
your_table
将是您的表名的复数形式1.编辑生成的迁移,使生成的迁移如下所示:
注:代码中8的限制是存储大小,范围为-9223372036854775808到+9223372036854775807,称为
bigint
,即大范围整数。1.运行
rake db:migrate
迁移数据库。1.通过运行
rails server
重新启动服务器,您就可以启动并运行了。有关数字类型的详细信息,请参阅https://www.postgresql.org/docs/9.4/static/datatype-numeric.html
41ik7eoe2#
日安。默认情况下,创建长度为32字节的列
要更改此设置,可以创建迁移,例如:
9wbgstp73#
我今天在PostgreSQL上也偶然发现了这个问题。我知道这个问题很老了,作者也在使用SQLite,但是因为很多人似乎都像我一样在这里结束了,所以让我发布了一个更新的解决方案。
对于Rails 5.1(我相信是4.1及更高版本,但没有测试)和PostgreSQL(可能还有其他数据库),正确的方法是将列类型设置为
bigint
,使用limit: 8
选项不会影响数据库。这是使用名为products的数据表和名为quantity的数据行的范例程式码: