Bạn có một numeric
trường có typmod numeric(8,2)
và bạn đang cố gắng lưu trữ một giá trị lớn hơn 999999.99
trong đó. Xem hướng dẫn PostgreSQL về NUMERIC
để biết thông tin về thang đo và độ chính xác số, là các giá trị định tính được hiển thị sau loại trong dấu ngoặc đơn.
Câu hỏi trước đây này dường như đề cập đến cùng một vấn đề với Rails, hiển thị mô hình Rails và cách chỉ định tỷ lệ và độ chính xác.
NUMERIC
không phải là trường ngày / giờ, mà là trường số.
Bản trình diễn của vấn đề:
regress=> SELECT NUMERIC(8,2) '999999.99';
numeric
-----------
999999.99
(1 row)
regress=> SELECT NUMERIC(8,2) '1000000.00';
ERROR: numeric field overflow
DETAIL: A field with precision 8, scale 2 must round to an absolute value less than 10^6.
Thật tiếc khi Pg không cho bạn biết đây là lĩnh vực gì. Tuy nhiên, rất khó để làm như vậy vì nó thường không biết giá trị nào sẽ đi vào trường nào khi nó phân tích các ký tự chuỗi. Bật log_statement = 'all'
trong postgresql.conf
, ALTER USER ... SET
, ALTER DATABASE ... SET
hoặc mỗi phiên với SET log_statement = 'all'
sau đó kiểm tra lại và kiểm tra nhật ký truy vấn.
Ngoài ra, hãy xem các định nghĩa bảng với \dt
trong psql
để xem những gì có thể có kiểu numeric(8,2)
và có thể gây ra sự cố.
Về lý do tại sao nó hoạt động cục bộ:DB có phải là PostgreSQL cục bộ không? Một số người dùng Rails dường như có một thiết lập rất kỳ lạ khi họ sử dụng SQLite cục bộ và PostgreSQL trên Heroku. Đây là một công thức cho sự hỗn loạn và các vấn đề triển khai. Sử dụng cùng một cơ sở dữ liệu trong quá trình phát triển và thử nghiệm. Nếu nó là PostgreSQL cục bộ, có phải là phiên bản giống nhau không?