Heroku上的“PG ::错误 – 数字字段溢出”

我构建了一个应用程序,用于查询Google Analytics过去7天的数据。 一切都在当地工作。 在Heroku上,该过程运行顺利,直到它试图获取今天的数据。 然后我收到以下错误:

2012-10-29T02:32:02+00:00 app[web.1]: ActiveRecord::StatementInvalid (PG::Error: ERROR: numeric field overflow 2012-10-29T02:32:02+00:00 app[web.1]: DETAIL: A field with precision 8, scale 2 must round to an absolute value less than 10^6. 

我试图弄清楚哪个变量不满意,但我现在还不知道。 我假设它与日期或时间有关。

任何想法或想法都会很棒:)

– 更新—

 ActiveRecord::Schema.define(:version => 20121014153338) do create_table "analytics", :force => true do |t| t.string "site" t.integer "visits" t.date "start_date" t.date "end_date" t.decimal "revenue_per_transaction", :precision => 8, :scale => 2 t.integer "transactions" t.decimal "item_quantity", :precision => 8, :scale => 2 t.integer "goal_starts" t.integer "goal_completes" t.decimal "goal_conversion", :precision => 8, :scale => 2 t.datetime "created_at", :null => false t.datetime "updated_at", :null => false t.decimal "goal_abandon", :precision => 8, :scale => 2 t.decimal "revenue", :precision => 8, :scale => 2 t.string "source" end end 

你有一个带有typmod numeric(8,2)numeric字段,你试图在其中存储一个大于999999.99的值。 有关数字刻度和精度的信息,请参阅NUMERIC上的PostgreSQL手册 ,它们是括号中的类型后显示的限定符。

这个早期的问题似乎涵盖了与Rails相同的问题,显示了Rails模型以及如何分配比例和精度。

NUMERIC不是日期/时间字段,它是一个数字字段。

演示的问题:

 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. 

遗憾的是Pg并没有告诉你当它是一个场时它是什么字段。 但是,它很难这样做,因为它通常不知道哪个值在解析字符串文字时会进入哪个字段。 在postgresql.confALTER USER ... SETALTER DATABASE ... SET或每个会话中使用SET log_statement = 'all'然后重新测试并检查查询日志。

另外在psql中查看带有\dt的表定义,看看有什么类型的numeric(8,2)可能导致问题。

至于它为什么在本地工作:本地DB PostgreSQL? 一些Rails用户似乎有一个非常奇怪的设置,他们在本地使用SQLite,在Heroku上使用PostgreSQL。 这是混乱和部署问题的一个方法。 在开发和测试中使用相同的数据库。 如果它本地的PostgreSQL,它是否是相同的版本?