2015-11-04 27 views
12

Bir dosyanın uzunluğunu temsil eden bir sayı kaydetmeye çalışıyorum (4825733517). Sütun tamsayı olarak ayarlanır. Doğrulama veya kısıtlama ayarlamam yok.Tam aralık PostgreSQL veritabanında aralık dışı

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

Bu değer için başka bir sütun türü kullanmalı mıyım?

cevap

22

, :limit değeri bayt olarak en kolon uzunluğu (documentation) 'dir.

4 bayt uzunluğunda saklayabileceğiniz en büyük imzalanmış tam sayı 2,147,483,647'dir, 4,825,733,517 değerinden daha küçüktür. Bayt limitini, örneğin 8 bayta uzun bir tamsayı (bigint PostgreSQL type) olarak artırabilirsiniz, bu, 9,223,372,036,854,775,807'ye kadar imzalı değerleri saklamanızı sağlar. Bir göç ile yapabilirsiniz

rails generate migration change_integer_limit_in_your_table gibi bir şeyle oluşturun ve aşağıdaki kodu:

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

FYI bu harika bir cevap ve * neredeyse * benim için çalıştı. Ne ** yaptın hepsi aynı sözdizimi, ancak 'update_column' yerine 'change_column'du. Rails 4.2.6 kullanıyorum, bu yüzden belki "update_column" kullanımdan kaldırıldı. –

+0

Kesinlikle haklısınız - 'update_column' basitçe yanlış, ilk yazarken diğer cevaplardan yanlış bir ipucu almış olabilirim. Gönderiyi düzenlediniz, gösterdiğiniz için teşekkürler – p4sh4

0

(raylar 4.2.4 üzerine) Bir göç ile veritabanı sütunun uzunluğunu değiştirmek gerekir:

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

Size daha büyük tamsayılar saklamak için izin verecektir.

+0

12 byte tamamen overkill ve ayrıca PostgreSQL kullanılabilir bir sayısal türe karşılık gelmez. – p4sh4

+0

Sadece 12 örnek olarak koydum. Kaydetmesi gereken maksimum tam sayıyı bile bilmiyoruz. – Caillou

4

the PostgreSQL documentation uyarınca bir tam sayı -2147483648 ila +2147483647 arasındadır. Yani bu tür için numaranız büyüktür.

Sütununuzu güncelleyin ve bigint olmasını istediğinizi belirtmek için parametre sınırını kullanın. tip integer sütun için

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