sql >> Databasteknik >  >> RDS >> PostgreSQL

PG::Fel - numeriskt fältspill på Heroku

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?




  1. Lägger till resultaten av CASE-uttalanden

  2. Få alla karaktärer före mellanslag i MySQL

  3. Kan inte få mysql-connector-python att installera i virtualenv

  4. Hur länge förblir en mysql_connect öppen?