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



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

heroku db:push --app my-app

在我的家用电脑上运行正常,但在我的工作电脑上,我得到这个错误:

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

我不确定那个日期是从哪里来的,我在任何地方都找不到它。你知道发生了什么和/或如何解决它吗?

使用Ruby 1.9.2-p290代替1.9.3-p0为我修复了它。根据Roger Braun的说法,这就是原因:

问题是(我认为),编组在Ruby 1.9.2之间发生了变化1.9.3,这不是真正的水龙头错误。随便用版本heroku运行推拉数据库(可能是1.9.2)。

从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的生产环境中。

只是把这个放在这里,因为我认为这个问题已经持续了很长时间,没有充分解决真正的问题。

我在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。

用1.9.3或1.9.2都不行

正如Pablo所指出的,问题与日期的编组有关(编组将日期转换为12:00:00+XXXX",尽管我的日期类型是'timestamp without timezone')。

无论如何,我通过将日期设置为空来解决这个问题,因此我可以成功地将其推送到Heroku。不过,这是一个非常糟糕的解决方案。我希望这个bug能尽快修复。

在我选择的平台(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一起工作的gem(例如回形针)

$ bundle install
& bundle exec heroku db:push

取消Gemfile之前的注释

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

不是一个干净的解决方案,但至少工作良好。

只是改变ruby版本对我不起作用。相反,我把问题缩小到新的Heroku工具带。

当使用旧的heroku宝石时,我能够db:push就好了。在heroku修复它之前,我已经创建了一个新的gemset并安装了heroku gem。我只是切换到这个宝石每当我需要做一个db:push。

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

尝试使用原生按键而不使用heroku db:push。

点击服务器POSTGRES_DATABASE_REMOTE_URL登录pass

tap push sqlite://db/development。sqlite3登录:pass@localhost: 5000

为我解决了问题

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

在win7-x64上,在heroku的雪松中创建应用程序并将pik (rvm-alternative)设置为使用ruby 1.9.2有效。简而言之,我所做的是:

  • 在cedar stack中创建了一个新的heroku应用程序(运行ruby-1.9.2)

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

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

  • 确保在1.9.3和1.9.2两个ruby版本中都安装了所有必要的gem

    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(生成)中添加了新的编辑到repo

    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
    

在Dosha的回答的帮助下终于得到了这个工作。(并感谢上面的hernanvicente的提示)

确保您的ruby版本与Heroku上运行的版本匹配。看起来1.9.2是这些迁移中最稳定的版本。

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

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

这可能仍然不能解决您的问题,因为您的heroku db:push命令使用的是Heroku工具栏,而不是旧的,现在已弃用的Heroku gem。不幸的是,我们实际上想要旧的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(如果与此不同,请使用您自己的文件路径)

最新更新