【Ruby 正規表現】開発環境に本番のデータを入れ込んでテストするときのメアド一括変更方法
ある日届く1通の不吉なメール
「○○のシステムについて、利用者からエラーが出るとの不具合報告があります」
こういうメールは心臓がヒュッとしますよね。
開発環境ですぐに原因が判明するような不具合ならいいですが、本番のデータで試さないと再現がとれないんじゃ困ります!
そんなときは本番のデータをdumpして情報書き換えてテストしちゃいましょう!
まずはデータをdumpする
まずは本番のデータを落としましょう。
sshでユーザログインし、データをdumpします。
pg_dump -O dumpするデータベース名 > 書き出すファイル名.dmp
これで「書き出すファイル名.dmp」というファイルができるので、scpで手元に転送します。
例えばこんな感じです(デスクトップに落としてます)。
scp sshユーザ名@サーバ名~/書き出すファイル名.dmp ~/Desktop
テスト用DBを作成してデータを流し込む
dmpファイルを落としたら、Rails側でテスト用DBを用意してあげましょう。
config/database.ymlに適当な名前でDB名を記載してcreateします。
rake db:create
DBができたらmigrateせずに、dmpファイルを流し込みます。
psql 新規作成したDB名 < ~/Desktop/書き出すファイル名.dmp
これで作成したDBに本番のデータが入ります。
本番用からテスト用にデータ整形
ここからが本題です!
本番データを流し込みましたが問題があります。
ユーザ管理があって、メールを飛ばす機能があるシステムだったら本人にメール飛んじゃいますよね?
そういう機能がないものならいいですが、だいたいユーザ管理ありますよね(ログインとか)。
そこでメアドを3行(省略すれば1行)で一括変換してしまいます。
※今回はgmailを想定し、先頭に「自分のアドレスの@以前+」を挿入し、@以降(ドメイン)を「gmail.com」に変換
例)自分のアドレスが「test@gmail.com」だったら「test+○○@gmail.com」に変換
まずは「rails c」でコンソールを立ち上げます。
そして下のコードを1行ずつ入れていくと…
User.all.each do |u| u.update(email: u.email.gsub(/\A(.*?)@.+\z/, 'test+\1@gmail.com')) end
※先頭に文字列を入れないで@以降のみ変更したい場合はu.email.gsub(/@.+/, '@rabbix.jp')でOK
ユーザのメアドを一気に変換しちゃいます!
正規表現とgsubを使った便利な処理でした。