ローカル開発環境のModelデータをコンソールで書き換える(Rails)

ローカル開発環境で登録されたデータを書き換えたかったので備忘録として書く。

変更したいModelのテーブルを見る

  • DBを操作するためにコンソールを起動する
% rails dbconsole

するとプロンプトがかわりSQLを叩けるようになる

development=#
  • SQLを叩いて見たいModelとカラムを出す

今回はproductsテーブル(モデル)のcreated_atupdated_atを変更したいので
idを含めてテーブルを出力する

development=# select id,created_at,updated_at from products;
     id     |         created_at         |         updated_at
------------+----------------------------+----------------------------
 1033498682 | 2021-02-11 21:19:28.377342 | 2021-02-19 05:16:38.259334
 1033498689 | 2021-02-16 06:02:34.481795 | 2021-02-19 06:21:35.591053
 1033498684 | 2021-02-15 10:05:29.429805 | 2021-02-19 07:55:34.359815
 1033498703 | 2021-02-22 05:19:27.567242 | 2021-02-22 05:19:27.729664
 1033498704 | 2021-02-22 05:26:57.909896 | 2021-02-22 05:26:57.922758
 1033498681 | 2021-02-09 01:04:37.932581 | 2021-02-09 01:04:37.932581
 1033498649 | 2021-01-28 08:00:30.830522 | 2021-02-14 06:56:01.74118
 1033498698 | 2021-02-16 06:19:37.667765 | 2021-02-17 05:04:01.551797
 1033498696 | 2021-02-16 06:19:19.166006 | 2021-02-17 05:04:04.504286
 1033498695 | 2021-02-16 06:19:04.007454 | 2021-02-17 05:05:13.466765
 1033498694 | 2021-02-16 06:18:18.464509 | 2021-02-17 05:05:14.955893
 1033498693 | 2021-02-16 06:18:06.320066 | 2021-02-17 05:05:15.903362
 1033498691 | 2021-02-10 21:03:00.05267  | 2021-02-10 21:03:00.05267
 1033498690 | 2021-02-13 21:03:00.05267  | 2021-02-13 21:03:00.05267

この表を確認しながら次の作業で変更していく

DBのデータを変更する

続いて

  • データを変更するためにRailsのコンソールに切り替える
% rails console

叩くと以下のようにirbが起動する

Loading development environment (Rails 6.0.3.4)
irb(main):001:0>
  • 変更したいレコードをローカル変数に格納する
    findメソッドで先ほどのテーブルのid(変更したいレコードのid)を引数に入れる
irb(main):001:0> product = Product.find(1033498682)
=> #<Product id: 1033498682, practice_id: 363506445, user_id: 253826460, body: "fdafdadsf", created_at: "2021-02-11 21:19:28", updated_at: "2021-02-19 05:16:38", wip: false, published_at: "2021-02-11 21:19:28", checker_id: 679998234>
  • created_atフィールドとupdated_atフィールドを変更する
    updateメソッドで変更したい値を指定して変更する
irb(main):002:0> product.update(created_at: "2021-02-10 21:19:28.377342", updated_at: "2021-02-10 21:19:28.377342")
=> true

trueで変更完了 - テーブルを確認すると変更されているはず

development=# select id,created_at,updated_at from products;
     id     |         created_at         |         updated_at
------------+----------------------------+----------------------------
 1033498682 | 2021-02-10 21:19:28.377342 | 2021-02-10 05:16:38.259334
 1033498689 | 2021-02-16 06:02:34.481795 | 2021-02-19 06:21:35.591053
 1033498684 | 2021-02-15 10:05:29.429805 | 2021-02-19 07:55:34.359815
 1033498703 | 2021-02-22 05:19:27.567242 | 2021-02-22 05:19:27.729664
 1033498704 | 2021-02-22 05:26:57.909896 | 2021-02-22 05:26:57.922758
 1033498681 | 2021-02-09 01:04:37.932581 | 2021-02-09 01:04:37.932581
 1033498649 | 2021-01-28 08:00:30.830522 | 2021-02-14 06:56:01.74118
 1033498698 | 2021-02-16 06:19:37.667765 | 2021-02-17 05:04:01.551797
 1033498696 | 2021-02-16 06:19:19.166006 | 2021-02-17 05:04:04.504286
 1033498695 | 2021-02-16 06:19:04.007454 | 2021-02-17 05:05:13.466765
 1033498694 | 2021-02-16 06:18:18.464509 | 2021-02-17 05:05:14.955893
 1033498693 | 2021-02-16 06:18:06.320066 | 2021-02-17 05:05:15.903362
 1033498691 | 2021-02-10 21:03:00.05267  | 2021-02-10 21:03:00.05267
 1033498690 | 2021-02-13 21:03:00.05267  | 2021-02-13 21:03:00.05267

カラム修飾子を追加したマイグレーションがロールバックできないとき

% rails db:rollbackしたらエラーが出てrollbackできなかったので修正方法を書く。

rollbackコマンド後のエラーはこんな感じ

This migration uses change_column, which is not automatically reversible.
To make the migration reversible you can either:
1. Define #up and #down methods in place of the #change method.
2. Use the #reversible method to define reversible behavior.

rollbackする手順

(1)メソッド名のchangeをupにする
  def change
    change_column :reports, :emotion, :integer, default: 2, null: false
  end

# 修正↓

  def up
    change_column :reports, :emotion, :integer, default: 2, null: false
  end
(2)rails db:rollbackを実行する

これでロールバックされdownの状態になる

rails db:migrate:statusで確認する

一番したのマイグレーションがdownになった

(3) マイグレーションファイルを書き換える

upは書けているので、downでupの逆のことを書けばOK

  def up
    change_column :reports, :emotion, :integer, default: 2, null: false
  end

  def down
    change_column :reports, :emotion, :integer, default: nil, null: true
  end

最後にrails db:migrateでupにすれば完成

qiita.com

ローカルでのいろいろ差分確認(GitHub)

忘れたときのメモです。

add前

% git diff

add後commit前

% git diff --cached

commit後push前

開発ブランチをpushしたことがある場合
(origin/[開発ブランチ]がある場合)
# git log origin/[開発ブランチ]..[開発ブランチ]
まだ一度も開発ブランチをpushしたことがない場合
((origin/[開発ブランチ]がない場合)
# git log origin/main..[開発ブランチ]

最新のコミットのみの変更

# git diff HEAD^

add前とcommit前など

% git status

# commit前
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
    modified:   foo.txt

# add前
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   baz.txt

# Git管理されていない、かつ .gitignore で管理除外対象にもされていないものの一覧
Untracked files:
  (use "git add <file>..." to include in what will be committed)
    .gitignore

特定のコードが書かれたファイルを検索する

カレントディレクトリ以下から、特定のコードが書かれているファイルを検索したいときの方法について

  • def fooを探したい場合
% find . -name "*" -type f | xargs grep "def foo"

grepの後の文字を変えることで検索できます

マッチしたファイルを全て吐き出してくれます

前の開発ブランチのコミットも一緒にコミットされていたとき

ブランチを切った時にmasterからではなく、他の開発ブランチ(今までいた開発ブランチ)からブランチを切ってしまったときにpushすると、コミットが前のブランチのコミットも一緒にコミットされてしまいます。どうやって解決したか書きたいと思います。

状況

  • Fooブランチ開発してPR作成
    • AとBというコミットがPushされている
  • BarブランチをFooブランチから切って開発してPR作成
    • CとDというコミットだけをPushしたが コミットは4つある(ABCDの順で)

解決方法

  • Fooブランチがmain(master)にマージされたら、ローカルのmainをgit pullする
  • Barブランチをにて、git rebase mainを実行する
  • その後、Barブランチでgit push origin +Barで強制プッシュする
  • BarブランチのPRを見るとコミットがCとDだけになっている

あっさりと解決しました。rebase -irevertresetを使うか迷いましたがよかったです!

過去にプッシュしたコミットのコミットメッセージを変更したい

現在、システム開発のプラクティスを進めています。フィヨルドブートキャンプのアプリの仕様はコミットメッセージは日本語で書くことになっています。しかし私は普段の癖で英語で書いてしまい、修正しなくてはいけなくなりました。そこで、どのコミットであってもコミットメッセージを変更できる方法を書きたいと思います。

状況

  • 自分だけの開発ブランチで開発中
  • コミットは2回、プッシュ済
  • 1回目のコミットメッセージを変更したい

方法

rebase -iを使うことでいつのコミットでも変更できます

実際の手順

戻りたいコミットまで戻る
以下の例だと2つ前までのコミットの状況を見られます
数字は戻りたいところまで数字を指定します

% git rebase -i HEAD~2

すると画面が切り替わリマス この画面はアクションを指定します

pick b5df9e8 add aaa => e b5df9e8 add aaa
pick 2cc06c4 bbb追加

~~~~~~~~~~~~~~~~~~~~~~~~~~~

この画面の上の2行がコミット履歴
一番最初のコミットを変更したいのでpickeまたはeditに変更して :wqで終了

すると画面が切り替わります ここは次の手順が書かれています

% git rebase -i HEAD~2
Stopped at b5df9e8...  add aaa
You can amend the commit now, with

  git commit --amend

Once you are satisfied with your changes, run

  git rebase --continue

まず、コミットメッセージを変更します 以下のコマンドを叩きます

% git commit --amend

先ほど指定したコミットのメッセージが出ているので書き換えます

add aaa => aaa追加

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

:wqで保存すると以下のようになります

% git commit --amend
[detached HEAD fa6040a] aaa追加
 Date: Fri Jan 15 15:52:18 2021 +0900
 1 file changed, 1 insertion(+)
 create mode 100644 aaa.txt

そしたら、以下コマンドで、rebaseを実行し編集を終了させます

% git rebase --continue
Successfully rebased and updated refs/heads/aaa.

最後に強制プッシュします

% git push origin +branch

GitHubでコミットを見るとコミットメッセージが変わっているはずです。