PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

PG::Error - dépassement de champ numérique sur Heroku

Vous avez un numeric champ avec typmod numeric(8,2) et vous essayez de stocker une valeur supérieure à 999999.99 dedans. Voir le manuel PostgreSQL sur NUMERIC pour plus d'informations sur l'échelle numérique et la précision, qui sont les qualificatifs affichés après le type entre parenthèses.

Cette question précédente semble couvrir le même problème avec Rails, montrant le modèle Rails et comment l'échelle et la précision sont attribuées.

NUMERIC n'est pas un champ date/heure, c'est un champ numérique.

Démo du problème :

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.

Dommage que Pg ne vous dise pas de quel champ il s'agit alors que c'est un champ. Cependant, il lui est difficile de le faire, car il ne sait généralement pas quelle valeur va entrer dans quel champ lorsqu'il analyse des littéraux de chaîne. Activer log_statement = 'all' dans postgresql.conf , ALTER USER ... SET , ALTER DATABASE ... SET , ou par session avec SET log_statement = 'all' puis retestez et examinez les journaux de requête.

Regardez aussi les définitions de table avec \dt dans psql pour voir ce qui pourrait avoir le type numeric(8,2) et pourrait être à l'origine du problème.

Quant à savoir pourquoi cela fonctionne localement :est-ce que la base de données locale est PostgreSQL ? Certains utilisateurs de Rails semblent avoir une configuration très étrange où ils utilisent SQLite localement et PostgreSQL sur Heroku. C'est une recette pour le chaos et les problèmes de déploiement. Utilisez la même base de données pour le développement et les tests. Si c'est l'est PostgreSQL en local, est-ce la même version ?