将数据推送到Heroku时出错:时区位移超出范围

时间:2011-11-16 12:19:36

标签: postgresql heroku taps

我运行以下命令将本地数据库的内容推送到Heroku:

heroku db:push --app my-app

从我的家用电脑上运行完美无缺,但是从我的工作电脑上我得到了这个错误:

  

点击服务器错误:PGError:错误:时区位移超出范围:“2011-11-15 12:00:00.000000 + 5894114400”

我不确定该日期的来源,我无法在任何地方的数据中找到它。有什么想法和/或如何解决它?

11 个答案:

答案 0 :(得分:32)

使用Ruby 1.9.2-p290而不是1.9.3-p0为我修复了它。 According to Roger Braun,这就是原因:

  

问题是(我认为),编组在Ruby 1.9.2之间发生了变化   和1.9.3,所以这不是一个真正的水龙头错误。只要用任何东西   版本heroku运行以推送和拉取数据库(可能是1.9.2)。

答案 1 :(得分:9)

从Ruby 1.9.3降级到Ruby 1.9.2对我来说听起来不是一个吸引人的选择。

Heroku的devcentre页面实际上建议使用pgbackups插件来管理数据库(https://devcenter.heroku.com/articles/pgbackups)。听起来它只是将生产数据库的备份下载到本地机器,但如果仔细阅读,它们有一个大的部分处理“导入数据库”。他们建议您将数据库上传到公共可访问的位置并运行建议的命令

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

因此,实际上它们提供了转储本地数据库的命令,建议将其上传到heroku的服务器可以从中获取数据库转储的位置的方法(假设您的本地开发机器不能从Internet公开访问),然后是以上命令将其上传到heroku的生产环境中。

只是把它放在这里,因为我认为问题一直存在很长时间而没有对真正的问题进行充分的解决。

答案 2 :(得分:8)

我在Heroku上运行1.9.3p125,在本地机器上运行1.9.3p125。如果我想db:push,我只需在上传时切换到1.9.2

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

然后推送完成后,我切换回1.9.3。

答案 3 :(得分:4)

使用1.9.3或1.9.2对我无效。

正如Pablo指出的那样,问题与日期的编组有关(编组会将日期转换为12:00:00 + XXXX“,尽管我的日期类型是'没有时区的时间戳')。

无论如何,我通过将日期设置为null来处理它,所以我可以成功地推送到Heroku。但是解决方案非常糟糕。我希望这个bug很快得到解决。

答案 4 :(得分:2)

在我选择的平台上(gentoo linux)不再提供Ruby 1.9.2。无论如何,可以同时安装一个版本的ruby 1.8.x.

以下是我解决这个问题的方法:

$ 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

现在我不得不暂时从我的项目Gemfile中评论所有不能使用ruby 1.8的宝石(例如paperclip)

$ bundle install
& bundle exec heroku db:push

从Gemfile取消注释之前评论的内容

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

不是一个干净的解决方案,但至少可以正常工作。

答案 5 :(得分:2)

只是改变ruby版本对我没用。相反,我已经将问题缩小到新的Heroku Toolbelt。

当使用较旧的heroku gem时,我能够db:推得很好。直到heroku修复它我创建了一个新的gemset并安装了heroku gem。每当我需要做db:push时,我就切换到这个gemset。

答案 6 :(得分:1)

你在哪个Heroku堆栈?如果您使用的是bamboo-ree-1.8.7,则使用的正确版本是1.8.7。这是一个编组问题,可以通过在服务器和客户端上使用相同的Ruby版本来解决。

答案 7 :(得分:1)

尝试使用没有heroku db的原生水龙头:推送。

点击服务器POSTGRES_DATABASE_REMOTE_URL登录传递

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

解决了我的问题

答案 8 :(得分:1)

它帮助我解决了我的问题,非常实用https://github.com/ricardochimal/taps/issues/92#issuecomment-11996909

答案 9 :(得分:0)

在win7-x64上,在heroku的雪松中创建app并设置pik(rvm-alternative)以使用ruby 1.9.2。简而言之,我做了什么:

  • 在雪松堆栈中创建了一个新的heroku应用程序(运行ruby-1.9.2)

    heroku create -s cedar
    
  • 安装了pik(rvm-alternative),然后按照安装后的说明进行操作

    gem install pik
    
  • 安装了ruby-1.9.2p290,将<RUBY192_INSTALL_DIR>/bin添加到$env:PATH

  • 将DevKit安装到ruby-1.9.2

  • 确保所有必需的宝石都安装在两个ruby版本1.9.3和1.9.2

    pik gem install <gem-1> <gem-2> ... <gem-n>
    
  • Gemfile

    中的生产,开发和测试环境指定了db gems
    # Development + Test:
    group :development, :test do
      gem 'pg', :platforms => :mingw
    end
    
    # Heroku:
    group :production do
      gem 'thin'
      gem 'pg'
    end
    
  • 之后将平台引用移至Gemfile.lock中的mingw32
    bundle install
    
  • GemfileGemfile.lock(已生成)中添加了对编辑的新修改

    git add .
    git commit -am "rebuilt Gemfile for Heroku"
    git push heroku master
    
  • 调整数据模型,推送本地数据

    heroku run rake db:migrate
    heroku db:push
    heroku open
    
  • 然后切换回ruby-1.9.3

    pik use 193
    

答案 10 :(得分:0)

最后在Dosha的回答here的帮助下得到了这一点。 (感谢上面的hernanvicente提示。)

确保您的ruby版本与Heroku上运行的版本相匹配。似乎1.9.2是这些迁移的最稳定版本。

将您的gemfile更改为具有以下内容(假设您使用的是SQLite):

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

这可能仍然无法解决您的问题,因为您的heroku db:push命令正在使用Heroku工具栏而不是旧的,现已弃用的heroku gem。不幸的是,我们实际上想要更老的宝石,但是heroku正在调用Heroku工具栏。要解决这个问题,您需要在您的ruby 1.9.2版本上安装heroku gem,然后通过其特定的文件路径访问它。

因此,接下来的步骤将展示如何使其发挥作用:

在控制台中运行以下命令:

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

然后运行:

rake assets:clean
bundle exec rake assets:precompile

将您的更改提交给Github。

然后在控制台中输入以下内容:

~/.rvm/gems/ruby-1.9.2-p320/gems/heroku-2.40.0/bin/heroku db:push (使用您自己的文件路径,如果它与此不同。)