J'essaie d'enregistrer un nombre représentant la longueur d'un fichier (4825733517). La colonne est définie pour taper un entier. Je n'ai aucune validation ou restriction définie.
RangeError: 4825733517 is out of range for ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Integer with limit 4
Devrais-je utiliser un autre type de colonne pour cette valeur? (sur Rails 4.2.4)
Pour les colonnes de type integer
, la valeur :limit
est la longueur maximale de la colonne en octets ( documentation ).
Avec une longueur de 4 octets, le plus grand nombre entier signé que vous pouvez stocker est 2 147 483 647, beaucoup plus petit que votre valeur de 4 825 733 517. Vous pouvez augmenter la limite d'octets, par exemple à 8 octets pour qu'elle soit un entier long (un bigint de type PostgreSQL ), cela vous permettra de stocker des valeurs signées allant jusqu'à 9 223 372 036 857 757.
Vous pouvez faire cela avec une migration, créez-la avec quelque chose comme Rails generate migration change_integer_limit_in_your_table
et le code suivant:
class ChangeIntegerLimitInYourTable < ActiveRecord::Migration
def change
change_column :your_table, :your_column, :integer, limit: 8
end
end
Selon la documentation de PostgreSQL , un entier va de -2147483648 à +2147483647. Donc, votre nombre est trop grand pour ce type.
Mettez à jour votre colonne et utilisez le paramètre limit pour indiquer que vous souhaitez avoir une bigint
.
change_column :table, :column, :integer, limit: 8
Vous devriez changer la longueur de la colonne dans votre base de données avec une migration:
update_column :my_table, :my_column, :integer, limit: 12
Cela vous permettra de stocker de plus grands nombres entiers.