4

我已经构建了一个应用程序,可以查询 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
4

1 回答 1

5

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

这个较早的问题似乎涵盖了 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是字段的时候没有告诉你这是什么字段。但是,它很难这样做,因为它在解析字符串文字时通常不知道哪个值将进入哪个字段。log_statement = 'all'postgresql.confALTER USER ... SETALTER DATABASE ... SET或 per-session 中启用,SET log_statement = 'all'然后重新测试并检查查询日志。

\dt另请查看带有in的表定义,psql以查看可能具有该类型numeric(8,2)并可能导致问题的表定义。

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

于 2012-10-29T02:42:34.347 回答