Heroku]处理数据库

时间:2013-01-21 02:46:13

标签: ruby-on-rails database postgresql heroku

我最近在处理heroku postgresql数据库时遇到了一个问题。

我想更新某个用户的属性(让他成为管理员),所以我从heroku中提取数据库以在本地更新其属性并再次将其推回。

heroku db:pull
UPDATE users SET user_type = 'admin' WHERE name = 'thisuser'; //in postgres
heroku db:push

然后,出现了以下问题。

!!! Caught Server Exception
HTTP CODE: 500
Taps Server Error: PGError: ERROR:  time zone displacement out of range: "2013-01-21 12:00:00.000000+5895153600"
LINE 1: ....facebook.com/thisuser', 'facebook', '2374538475', '2013-01-2...

所以我再次运行以下命令以从错误中恢复。

heroku db:pull
heroku db:push

这导致整个我的数据库从生产和开发中消失​​。 我有两个问题要问。

  1. 在Heroku环境中更新某些用户的属性的正确方法是什么?仅仅为了更新小对象的一个​​属性而拉动整个数据库似乎有点太多了。
  2. 为什么我的操作会导致从数据库中清除所有内容?
  3. 感谢您的帮助。我非常感激。

2 个答案:

答案 0 :(得分:1)

对于你的命令,我建议你做这种小事in a console

$ heroku run rails console

您可以像在本地计算机上一样输入一次性命令。

关于不稳定性:显然在Ruby 1.9.3上使用Heroku是bug。在1.9.2你不会得到问题。因此,如果你使用rbenv或rvm,你可以在执行heroku之前切换rubies。你甚至可能想写一个小的shell脚本,例如:

#!/bin/sh
#safe_heroku.sh
HEROKU_CMD=/usr/local/heroku/bin/heroku   # Check which heroku
RBENV_CMD=/usr/bin/rbenv                  # Check which rbenv
SAFE_RUBY_VERION=1.9.2                    # Check rbenv versions 

$RBENV_CMD shell $SAFE_RUBY_VERSION
$HEROKU_CMD "$@"

用法:

$ safe_heroku rake db:push   # Or whatever command you want to run...

答案 1 :(得分:0)

我同意上面的答案,但是我尝试使用ruby来安全地进行我需要的任何更改,例如向用户添加角色我会这样做:

$ heroku run console
user = User.find(1)
Role = Role.find(1)
user.roles << role

或在你的情况下

user = User.find_by_name('user name')
user.user_type = 'admin'
user.save!

更安全地使用经过测试的代码进行更新而不是破解数据库。