PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PG::Error - numerischer Feldüberlauf auf Heroku

Sie haben einen numeric Feld mit typmod numeric(8,2) und Sie versuchen, einen Wert größer als 999999.99 zu speichern drin. Siehe das PostgreSQL-Handbuch zu NUMERIC für Informationen zur numerischen Skala und Genauigkeit, die die Qualifizierer sind, die nach dem Typ in Klammern angezeigt werden.

Diese frühere Frage scheint das gleiche Problem mit Rails abzudecken und zeigt das Rails-Modell und wie Skalierung und Genauigkeit zugewiesen werden.

NUMERIC ist kein Datums-/Zeitfeld, sondern ein Zahlenfeld.

Demo der Ausgabe:

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.

Schade, dass Pg Ihnen nicht sagt, um welches Feld es sich handelt, wenn es sich um ein Feld handelt. Das ist jedoch schwierig, weil es normalerweise nicht weiß, welcher Wert in welches Feld kommt, wenn es String-Literale analysiert. Aktivieren Sie log_statement = 'all' in postgresql.conf , ALTER USER ... SET , ALTER DATABASE ... SET , oder pro Sitzung mit SET log_statement = 'all' Testen Sie dann erneut und untersuchen Sie die Abfrageprotokolle.

Sehen Sie sich auch die Tabellendefinitionen mit \dt an in psql um zu sehen, was den Typ numeric(8,2) haben könnte und könnte das Problem verursachen.

Warum es lokal funktioniert:Ist die lokale DB PostgreSQL? Einige Rails-Benutzer scheinen ein sehr seltsames Setup zu haben, bei dem sie SQLite lokal und PostgreSQL auf Heroku verwenden. Dies ist ein Rezept für Chaos und Bereitstellungsprobleme. Verwenden Sie beim Entwickeln und Testen dieselbe Datenbank. Wenn es ist PostgreSQL lokal, ist es die gleiche Version?