マイグレーション・ロールバック:「チェンジ」メソッドの落とし穴を学ぶ
5221 ワード
私は最近FlatironのソフトウェアエンジニアリングBootcampの第3段階のプロジェクトを終えました.私はフロントエンドのための反応を使用して育てられたベッドの庭の計画のアプリを構築し、私のバックエンドのActiveRecordとラックとルビー.それは私の最初の実際のバックエンドの経験だった.あなたが展開アプリをチェックアウトすることができますhere .
私は、このプロジェクトの私自身の間違いから多くを学ばなければなりませんでした、そして、特に1つの間違いはこのブログポストがActiveRecord移動について学ぶ他の人に対する注意の語として役立つことができることを願っています.
これは、すべてのActiveRecordの移行がサポートしていないことです
これを「間違い」と呼ぶことは、少し誤解を招くことです.それは本当にActiveRecordの移行とRAKEコマンドの理解の私自身の不足に起因する間違いの連鎖だった.
この間違いの連鎖は、私の植物モデルの37レコードと、私のノートモデルの3倍で始まりました.
私は、キュートであると思いました、私自身に若干の余分の『反応で制御された形』を与えて、フォームを
私の次のミスステップは、私が私のモデルで不適切な関連を持っていると理解したときでした.修正するには、外国人IDを削除するためのマイグレーションを書きました.
「問題はない」と私は思った.
「ああ、そんなに速くない!」とActiveRecord :
私は、私の欲求不満が育ったので、無謀さを増しているものをしようとして、googlingを始めました.ここで私は、私が直面していた問題を解決する方法を尋ねていたと考えているスタックオーバーフローの質問を誤解し、実行の致命的なミスを犯した
🙃 恐ろしい.
まず最初に、何かが間違っているとき、特にデータと共に働くとき、止まります.休憩しなさい.散歩に行きなさい.データベースコマンドのミスは、貴重な時間がかかる恐ろしい結果を持つことができます.そして、あなたはそれを走らせる勇気がありません@ $!ingコマンドを知っているまで.
したら、問題から離れて、それに戻って来て、アドバイスを読んで慎重に.
このポストを書く際に、私は、私が遭遇した最初の答えを読みました
その答えの次の行は、指定したバージョンにロールバックする方法を説明します
不可逆的な移動後に別のマイグレーションを作成した場合、 使用する不可逆移行ファイルを変更する
私は、このプロジェクトの私自身の間違いから多くを学ばなければなりませんでした、そして、特に1つの間違いはこのブログポストがActiveRecord移動について学ぶ他の人に対する注意の語として役立つことができることを願っています.
これは、すべてのActiveRecordの移行がサポートしていないことです
change
方法(あるいは全く)これはActive Record Migration docs , 明らかに災難の前に私の目を逃がしたセクションは、打ちました.誤り
これを「間違い」と呼ぶことは、少し誤解を招くことです.それは本当にActiveRecordの移行とRAKEコマンドの理解の私自身の不足に起因する間違いの連鎖だった.
この間違いの連鎖は、私の植物モデルの37レコードと、私のノートモデルの3倍で始まりました.
私は、キュートであると思いました、私自身に若干の余分の『反応で制御された形』を与えて、フォームを
POST
私のバックエンドにこのデータ.私が1つのコマンドで後で破壊した労働を浪費する時間.私の次のミスステップは、私が私のモデルで不適切な関連を持っていると理解したときでした.修正するには、外国人IDを削除するためのマイグレーションを書きました.
class RemoveGardenIdColumnFromPlants < ActiveRecord::Migration[6.1]
def change
remove_column :plants, :garden_id
end
end
これを移行した後、私は新しいモデルとさらに別の移行を作成しました.私は私のスキーマをチェックして、私の協会からremove_column
マイグレーションはまだプラントテーブルにありました、これは関連IDを削除する正しい方法ではなかったからです.「問題はない」と私は思った.
「ああ、そんなに速くない!」とActiveRecord :
===========================================================
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:
remove_column is only reversible if given a type.
ここでは物事は非常に私のために南行く.It's important to note that up until this point, it was absolutely possible for me to reverse this migration and not lose my data in the process.
Taking a break before the panic starts might be the most important lesson here.
私は、私の欲求不満が育ったので、無謀さを増しているものをしようとして、googlingを始めました.ここで私は、私が直面していた問題を解決する方法を尋ねていたと考えているスタックオーバーフローの質問を誤解し、実行の致命的なミスを犯した
rake db:drop
. これは私が移行ミスを削除することができましたが、私はまた、私は私が作ったその形式を介して提出時間を費やしていたすべてのデータを失った.🙃 恐ろしい.
間違いを避ける
まず最初に、何かが間違っているとき、特にデータと共に働くとき、止まります.休憩しなさい.散歩に行きなさい.データベースコマンドのミスは、貴重な時間がかかる恐ろしい結果を持つことができます.そして、あなたはそれを走らせる勇気がありません@ $!ingコマンドを知っているまで.
したら、問題から離れて、それに戻って来て、アドバイスを読んで慎重に.
このポストを書く際に、私は、私が遭遇した最初の答えを読みました
up
and down
メソッドremove_column
移行私はこれを試したが、同じエラーを受けた.その答えの次の行は、指定したバージョンにロールバックする方法を説明します
rake db:down VERSION=<your-version-number-here>
. 私は私のマイグレーションの最初のバージョンにロールバックしようとしました.そして、それは働きませんでした、この線が実際に私に言っていたものがそれであったので、私はremove_column
, 私はロールバックする必要がありますremove_column
で移動し、up\down
実装.解決策
rake db:down VERSION=<your-version-number-here>
up
and down
変更の代わりに、class RemoveGardenIdColumnFromPlants < ActiveRecord::Migration[6.1]
def up
remove_column :plants, :garden_id
end
def down
add_column :plants, :garden_id, :integer
end
end
または使用change
:class RemoveGardenIdColumnFromPlants < ActiveRecord::Migration[6.1]
def change
remove_column :plants, :garden_id, :integer
end
end
ActiveRecordは素晴らしいツールですが、移行は急カーブを学ぶことができます.あなたの時間を取る、息をし、ドロップテーブルの上に泣かないでください.Reference
この問題について(マイグレーション・ロールバック:「チェンジ」メソッドの落とし穴を学ぶ), 我々は、より多くの情報をここで見つけました https://dev.to/raquii/activerecord-migration-rollback-learning-the-pitfalls-of-the-change-method-the-hard-way-1240テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol