2015-11-04 18 views
12

Sto tentando di salvare un numero che rappresenta la lunghezza di un file (4825733517). La colonna è impostata per digitare un numero intero. Non ho alcuna convalida o restrizioni impostate.Numero intero fuori intervallo nel database PostgreSQL

RangeError: 4825733517 is out of range for ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Integer with limit 4 

Devo utilizzare un altro tipo di colonna per questo valore? (Su rotaie 4.2.4)

risposta

22

Per colonne di tipo integer, il valore :limit è la lunghezza della colonna massima in byte (documentation).

Con una lunghezza di 4 byte, il numero intero con segno più grande che è possibile memorizzare è 2.147.483.647, molto inferiore al valore di 4.825.733.517. È possibile aumentare il limite di byte, ad esempio 8 byte per essere un numero intero lungo (uno bigint PostgreSQL type), ciò consentirà di memorizzare valori firmati fino a 9.223.372.036.854.775,807.

Si può fare questo con una migrazione crearlo con qualcosa come rails generate migration change_integer_limit_in_your_table, e il seguente codice:

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

FYI questa è un'ottima risposta e * quasi * ha funzionato per me. Ciò che ** ha ** funzionava era la stessa sintassi ma 'change_column' invece di' update_column'. Sto usando Rails 4.2.6 quindi forse "update_column" è deprecato. –

+0

Hai assolutamente ragione - 'update_column' è semplicemente errato, potrei aver trovato un suggerimento sbagliato dalle altre risposte quando scrivo per la prima volta. Modificato il post, grazie per avermelo fatto notare – p4sh4

0

Si dovrebbe modificare la lunghezza della colonna nel database con una migrazione:

update_column :my_table, :my_column, :integer, limit: 12 

Essa vi permetterà di memorizzare numeri interi più grandi.

+0

12 byte è completamente eccessivo, e anche non corrisponde a un tipo numerico disponibili in PostgreSQL. – p4sh4

+0

Ho appena messo 12 come esempio. Non conosciamo nemmeno il numero intero massimo che dovrà salvare. – Caillou

4

In base a the PostgreSQL documentation un numero intero ha un intervallo da -2147483648 a +2147483647. Quindi il tuo numero è grande per questo tipo.

Aggiornare la colonna e utilizzare il limite di parametro per indicare che si desidera avere un bigint.

change_column :table, :column, :integer, limit: 8 
Problemi correlati