sql >> Databáze >  >> RDS >> PostgreSQL

PG::Error - přetečení číselného pole na Heroku

Máte numeric pole s typmod numeric(8,2) a pokoušíte se uložit hodnotu větší než 999999.99 v něm. Viz příručku PostgreSQL na NUMERIC informace o číselném měřítku a přesnosti, což jsou kvalifikátory zobrazené za typem v závorkách.

Tato dřívější otázka Zdá se, že pokrývá stejný problém s Rails, ukazuje model Rails a jak je přiřazeno měřítko a přesnost.

NUMERIC není pole data/času, je to číselné pole.

Demo vydá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.

Škoda, že Pg neřekne, o jaké pole se jedná, když je to pole. Je to však pro ni obtížné, protože při analýze řetězcových literálů obvykle neví, která hodnota půjde do kterého pole. Povolit log_statement = 'all' v postgresql.conf , ALTER USER ... SET , ALTER DATABASE ... SET , nebo na relaci s SET log_statement = 'all' poté znovu otestujte a prozkoumejte protokoly dotazů.

Podívejte se také na definice tabulek pomocí \dt v psql abyste viděli, co může mít typ numeric(8,2) a může být příčinou problému.

Pokud jde o to, proč to funguje lokálně:Je místní DB PostgreSQL? Zdá se, že někteří uživatelé Rails mají velmi zvláštní nastavení, kde používají SQLite lokálně a PostgreSQL na Heroku. To je recept na chaos a problémy s nasazením. Při vývoji a testování používejte stejnou databázi. Pokud je Lokálně PostgreSQL, je to stejná verze?




  1. WorkbenchJ - Chyba:agregace nejsou povoleny v klauzuli GROUP BY

  2. Přidejte jedinečné omezení založené na hodnotě pole

  3. Jak mohu sloučit sloupce ze dvou tabulek do jednoho výstupu?

  4. Přihlaste se do souboru přes PHP nebo se přihlaste do databáze MySQL – co je rychlejší?