1

最近、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

そして、これにより、本番環境と開発環境の両方から私の DB 全体が一掃されました。2つ質問があります。

  1. Heroku環境で一部のユーザーの属性を更新する適切な方法は何ですか? 小さなオブジェクトの 1 つの属性を更新するためだけに DB 全体をプルするのは少し多すぎるように思えます。
  2. 私のアクションが DB からすべてを一掃する結果になったのはなぜですか?

ご協力ありがとうございました。とても感謝しています。

4

2 に答える 2

1

コマンドについては、コンソールでこの種の小さなことを行うことをお勧めします。

$ heroku run rails console

ローカル マシンと同じように、1 回限りのコマンドを入力できます。

不安定性について: Ruby 1.9.3 の Herokuのバグのようです。1.9.2 では問題は発生しません。そのため、rbenv や rvm を使用すると、heroku を実行する前に ruby​​ を切り替えることができます。ちょっとしたシェルスクリプトを書きたいと思うかもしれません:

#!/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...
于 2013-01-21T03:09:27.980 に答える
0

上記の回答に同意しますが、ルビーを使用して、たとえばユーザーにロールを追加するために必要な変更を安全に行うようにしています。

$ 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!

DB をハッキングする代わりに、テスト済みのコードを使用して更新を行う方が安全です。

于 2013-01-21T13:13:50.453 に答える