QA@IT

Heroku で db:push が time zone displacement out of range のエラーに

4674 PV

手元で作ったRailsアプリでsqlite3のデータをHerokuにpushしようとするとエラーになります。

~/rails/project (master) heroku db:push sqlite://db/development.sqlite3
Loaded Taps v0.3.24
Warning: Data in the app 'project' will be overwritten and will not be recoverable.

 !    WARNING: Destructive Action
 !    This command will affect the app: project
 !    To proceed, type "project" or re-run this command with --confirm project

> project
Sending schema

Schema:          0% |                                          | ETA:  --:--:--
Schema:         50% |=====================                     | ETA:  00:00:01
Schema:        100% |==========================================| ETA:  00:00:00
Schema:        100% |==========================================| Time: 00:00:03
Sending indexes

schema_migrat:   0% |                                          | ETA:  --:--:--
schema_migrat: 100% |==========================================| ETA:  00:00:00
schema_migrat: 100% |==========================================| Time: 00:00:01
Sending data
2 tables, 35 records

schema_migrat:   0% |                                          | ETA:  --:--:--
schema_migrat: 100% |==========================================| ETA:  00:00:00
schema_migrat: 100% |==========================================| Time: 00:00:00

project:         0% |                                          | ETA:  --:--:--

Saving session to push_201207140422.dat..
!!! Caught Server Exception
HTTP CODE: 500
Taps Server Error: PGError: ERROR:  time zone displacement out of range: "2012-07-13 12:00:00.000000+5894692800"

使っているバージョンは、

  • Ruby 1.9.3-p194
  • Rails 3.2.6
  • RVM 1.13.8
  • Bundler 1.2.0.pre.1
  • Heroku(cedar stack)

という感じです。モデルは1つだけ、DBのスキーマは、date と integer と text があるだけのシンプルなものです。エラーは Taps というgemっぽいのですが、原因や対処法などご存知の方はいらっしゃいますでしょうか。

回答

https://github.com/ricardochimal/taps/issues/92

にあるように、これは Ruby 1.9.2 と Ruby 1.9.3で変わった marshalling フォーマットの非互換が原因で起こっているようです。一時的に Ruby を 1.9.2 へダウングレードして db:push すれば問題は回避できました。

編集 履歴 (0)

回避済のようですが、別解として特にテーブルを指定してsqlite3のデータをherokuにアップする方法を試してみました。(テーブル名:hoge, ダンプファイル名:hogeinsert.sql)

1. 開発側sqlite3でテーブルを指定してdumpを採取

$ cd db
$ sqlite3 ./development.sqlite3
sqlite> .output hogeinsert.sql
sqlite> .dump hoge

これでhogeテーブルの内容がhogeinsert.sqlにinsert文として吐き出されます。

2. dumpファイルを編集(削除)
先頭の
PRAGMA foreign_keys=OFF;
はエラーになるので削除します。

3. seed.rbで該当SQL文のファイルを読んで実行するようにします。

open File.join(Rails.root, 'db', 'hogeinsert.sql') do |f|
  sql1 = f.read
  ActiveRecord::Base.connection.execute sql1
end

4. 一連のgit更新、heroku pushで heroku更新

5. herokuプロジェクトルートでdb:seedを実行

$ heroku run rake db:seed

これでテーブル毎のデータのherokuへの格納ができました。
【参考】
テーブル毎db:seed
http://d.hatena.ne.jp/benikujyaku/20111208/1323334447

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。