Heroku上的"PG ::错误 - 数字字段溢出"

Ric*_*ton 4 postgresql ruby-on-rails heroku

我构建了一个应用程序,用于查询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.
Run Code Online (Sandbox Code Playgroud)

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

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

- 更新---

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
Run Code Online (Sandbox Code Playgroud)

Cra*_*ger 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.
Run Code Online (Sandbox Code Playgroud)

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

也期待在与表定义\dtpsql,看看有什么可能的类型numeric(8,2),可能会造成问题.

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