Du har en numeric
fält med typmod numeric(8,2)
och du försöker lagra ett värde som är större än 999999.99
i det. Se PostgreSQL-manualen på NUMERIC
för information om numerisk skala och precision, som är kvalificeringarna som visas efter typen inom parentes.
Denna tidigare fråga verkar täcka samma problem med Rails, och visar Rails-modellen och hur skalan och precisionen tilldelas.
NUMERIC
är inte ett datum/tid-fält, det är ett nummerfält.
Demo av problemet:
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.
Det är synd att Pg inte berättar vilket fält det här är när det är ett fält. Det är dock svårt för den att göra det, eftersom den vanligtvis inte vet vilket värde som kommer in i vilket fält när den analyserar strängliteral. Aktivera log_statement = 'all'
i postgresql.conf
, ALTER USER ... SET
, ALTER DATABASE ... SET
, eller per-session med SET log_statement = 'all'
testa sedan igen och undersök frågeloggarna.
Titta även på tabelldefinitionerna med \dt
i psql
för att se vad som kan ha typen numeric(8,2)
och kan vara orsaken till problemet.
Vad gäller varför det fungerar lokalt:Är den lokala DB PostgreSQL? Vissa Rails-användare verkar ha en väldigt udda uppsättning där de använder SQLite lokalt och PostgreSQL på Heroku. Detta är ett recept för kaos och distributionsproblem. Använd samma databas vid utveckling och testning. Om det är PostgreSQL lokalt, är det samma version?