我运行以下命令将本地数据库的内容推送到 Heroku:
heroku db:push --app my-app
在我的家用计算机上,这可以完美运行,但在我的工作计算机上,我收到此错误:
Taps服务器错误:PGError:错误:时区位移超出范围:“2011-11-15 12:00:00.000000+5894114400”
我不确定那个日期是从哪里来的,我在任何地方的数据中都找不到它。任何想法发生了什么和/或如何解决它?
我运行以下命令将本地数据库的内容推送到 Heroku:
heroku db:push --app my-app
在我的家用计算机上,这可以完美运行,但在我的工作计算机上,我收到此错误:
Taps服务器错误:PGError:错误:时区位移超出范围:“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 的开发中心页面实际上建议使用 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”,尽管我的日期类型是“没有时区的时间戳”)。
无论如何,我通过将日期设置为空来解决它,所以我可以成功推送到 Heroku。但是,非常糟糕的解决方案。我希望这个错误会很快得到修复。
在我选择的平台(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 Toolbelt。
使用较旧的 heroku gem 时,我可以 db:push 就好了。在 heroku 修复它之前,我创建了一个新的 gemset 并安装了 heroku gem。每当我需要执行 db:push 时,我都会切换到这个 gemset。
你在哪个 Heroku 堆栈上?如果您使用的是bamboo-ree-1.8.7,则正确使用的版本是1.8.7。这是一个编组问题,可以通过在服务器和客户端上使用相同的 Ruby 版本来解决。
尝试在没有 heroku db:push 的情况下使用本机水龙头。
点击服务器 POSTGRES_DATABASE_REMOTE_URL 登录密码
点击 push sqlite://db/development.sqlite3 login:pass@localhost:5000
为我解决了问题
在 win7-x64 上,在 heroku 的 cedar 中创建应用程序并将 pik (rvm-alternative) 设置为使用 ruby 1.9.2 有效。简而言之,我做了什么:
在 cedar 堆栈中创建了一个新的 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
确保所有必要的 gem 都安装在 ruby 版本 1.9.3 和 1.9.2 中
pik gem install <gem-1> <gem-2> ... <gem-n>
为生产、开发和测试环境指定的 db gemsGemfile
# 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
在 repo中添加了新的编辑Gemfile
和Gemfile.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
终于在 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
(使用您自己的文件路径,如果它与此不同。)