我运行以下命令将本地数据库的内容推送到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
中的mingw32bundle install
-
在
Gemfile
和Gemfile.lock
(生成)中添加了新的编辑到repogit 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
(如果与此不同,请使用您自己的文件路径)