Error when pushing data to Heroku: time zone displ

2019-01-09 02:48发布

问题:

I run the following command to push the contents of my local database to Heroku:

heroku db:push --app my-app

From my home computer this works flawlessly but from my work computer I get this error:

Taps Server Error: PGError: ERROR: time zone displacement out of range: "2011-11-15 12:00:00.000000+5894114400"

I'm not sure where that date is coming from, I can't find it in the data anywhere. Any ideas what's going on and/or how to fix it?

回答1:

Using Ruby 1.9.2-p290 instead of 1.9.3-p0 fixed it for me. According to Roger Braun, this is the reason:

The problem is (I think), that marshalling changed between Ruby 1.9.2 and 1.9.3, so this is not really a taps error. Just use whatever version heroku runs to push and pull databases (Probably 1.9.2).



回答2:

Downgrading to Ruby 1.9.2 from Ruby 1.9.3 does not sound like an appealing option to me.

Heroku's devcentre page actually suggests using pgbackups addon to managing databases ( https://devcenter.heroku.com/articles/pgbackups) . It may sound like it's only for taking backups of production databases down to your local machine but if you read it carefully, they have a large section which deals with "importing a database". What they suggest is that you upload your database to a publically accessible location and run the suggested command

heroku pgbackups:restore DATABASE 'http://s3.amazonaws.com/.....mydb.dump?authparameters'

So, in effect they provide commands to dump your local database, suggest ways to upload it to a location that heroku's servers can fetch your database dump from (assuming your local development machine is not publically accessible from the internet) and then the above command for it to be uploaded into production environment on heroku.

Just putting this up here, since i think problem has been persisting for a very long time without adequate resolution on the real problem.



回答3:

I run 1.9.3p125 on Heroku and 1.9.3p125 on my local machine. If I want to db:push I just switch to 1.9.2 while uploading:

rvm use ruby-1.9.2-p290
heroku db:push --app my-app
rvm use ruby-1.9.3-p125

Then once the push is complete, I switch back to 1.9.3.



回答4:

It didn't work for me either using 1.9.3 or 1.9.2.

As Pablo pointed out the problem has to do with the marshalling of the dates (the marshalling converts the date to 12:00:00+XXXX" despite my date type was 'timestamp without timezone').

Anyway, I worked it around by setting the dates to null, so I could successfully push to Heroku. Very poor solution, though. I hope the bug will get fixed soon.



回答5:

On my platform of choice (gentoo linux) Ruby 1.9.2 is not available anymore. Anyway a version of ruby 1.8.x can be installed at the same time.

Here is how I worked around the issue:

$ eselect ruby list
Available Ruby profiles:
[1]   ruby18 (with Rubygems)
[2]   ruby19 (with Rubygems) *

$ sudo eselect ruby set 1
Password: 
Successfully switched to profile:
ruby18

Now I had to temporally comment from my project Gemfile all the gems that don't work with ruby 1.8 (for example paperclip)

$ bundle install
& bundle exec heroku db:push

Uncomment from Gemfile what was commented before

$ sudo eselect ruby set 2
Password: 
Successfully switched to profile:
ruby19

Not a clean solution but at least works fine.



回答6:

Just changing the ruby version has not worked for me. Instead I've narrowed down the issue to the new Heroku Toolbelt.

When using the older heroku gem I'm able to db:push just fine. Until heroku fixes it i've created a new gemset and installed the heroku gem. I just switch to this gemset whenever I need to do a db:push.



回答7:

Which Heroku stack are you on? If you are on bamboo-ree-1.8.7 the right version to use is 1.8.7. This is a marshalling problem and can be solved by using the same Ruby version on both the server and the client.



回答8:

Try to use native taps without heroku db:push.

taps server POSTGRES_DATABASE_REMOTE_URL login pass

taps push sqlite://db/development.sqlite3 login:pass@localhost:5000

solved the problem for me



回答9:

It helped me to solve my problem, very practical https://github.com/ricardochimal/taps/issues/92#issuecomment-11996909



回答10:

On win7-x64, creating app in heroku's cedar and setting pik (rvm-alternative) to use ruby 1.9.2 worked. In a nutshell, what I did:

  • created a new heroku app in cedar stack (running ruby-1.9.2)

    heroku create -s cedar
    
  • installed pik (rvm-alternative), then followed the post-install instructions

    gem install pik
    
  • installed ruby-1.9.2p290, added <RUBY192_INSTALL_DIR>/bin to $env:PATH

  • installed DevKit to ruby-1.9.2

  • ensured all necessary gems are installed in both ruby versions, 1.9.3 and 1.9.2

    pik gem install <gem-1> <gem-2> ... <gem-n>
    
  • specified db gems for production, development, and test environments in Gemfile

    # Development + Test:
    group :development, :test do
      gem 'pg', :platforms => :mingw
    end
    
    # Heroku:
    group :production do
      gem 'thin'
      gem 'pg'
    end
    
  • removed platform refs to mingw32 in Gemfile.lock after

    bundle install
    
  • added new edits in Gemfile and Gemfile.lock (generated) to repo

    git add .
    git commit -am "rebuilt Gemfile for Heroku"
    git push heroku master
    
  • raked up data models, pushed local data up

    heroku run rake db:migrate
    heroku db:push
    heroku open
    
  • then switched back to ruby-1.9.3

    pik use 193
    


回答11:

Finally got this to work with help from Dosha's answer here. (And thank you to hernanvicente above for the tip.)

Make sure your version of ruby matches the version running on Heroku. It seems like 1.9.2 is the stablest version for these migrations.

Change your gemfile to have the following (assuming you're using SQLite):

group :development do
 gem 'taps', :require => false
 gem 'sqlite3'
end

This likely still does not resolve your problem because your heroku db:push command is using the Heroku toolbar instead of the older, now-deprecated heroku gem. Unfortunately, we actually want the older gem, but the Heroku Toolbar is being called by heroku. To get around this, you will need to install the heroku gem on your version of ruby 1.9.2 and then access it by its specific filepath.

So, the next steps show how you can get this to work:

Run the following commands into your console:

rvm install ruby-1.9.2-p320
rvm use ruby-1.9.2-p320
bundle install`
sudo gem install heroku --no-ri --no-rdoc

Then run:

rake assets:clean
bundle exec rake assets:precompile

Commit your changes to Github.

Then enter the following into your console:

~/.rvm/gems/ruby-1.9.2-p320/gems/heroku-2.40.0/bin/heroku db:push (Use your own filepath, if it's different from this.)