我已经构建了一个应用程序,可以在过去7天的数据中查询Google Analytics。一切都在当地工作。在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
答案 0 :(得分:5)
您有一个numeric
字段,其中包含typmod numeric(8,2)
,并且您尝试在其中存储大于999999.99
的值。有关数字刻度和精度的信息,请参阅the PostgreSQL manual on NUMERIC
,这些是括号内的类型后显示的限定符。
This earlier question似乎涵盖了与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.conf
,ALTER USER ... SET
或每个会话ALTER DATABASE ... SET
中启用SET log_statement = 'all'
,然后重新测试并检查查询日志。
另请查看\dt
中psql
的表格定义,以查看可能包含numeric(8,2)
类型的内容,并可能导致问题。
至于它为什么在本地工作:本地数据库是PostgreSQL吗?一些Rails用户似乎有一个非常奇怪的设置,他们在本地使用SQLite,在Heroku上使用PostgreSQL。这是混乱和部署问题的一个方法。在开发和测试中使用相同的数据库。如果 本地是PostgreSQL,它的版本是否相同?