Doctrineスキーマの更新を実行するだけでなく、移行することの実際的な利点は何ですか?
安全?
orm:schema-tool:update
コマンド(doctrine:schema:update
in Symfony)警告
この操作は、実稼働環境では実行しないでください。
しかし、これはなぜですか?もちろん、データを削除することはできますが、移行も可能です。
柔軟性?
列のデフォルトなどを追加するように移行を調整できると思いましたが、Doctrineは次の差分でスキーマとコードの不一致に気づき、変更を踏みにじるので、これはしばしば機能しません。 。
schema-tool
を使用している場合、データベースの変更履歴は保持されません。本番/ステージング環境では、これは大きな欠点です。
ライブプロジェクトに複雑なデータベース構造があると仮定しましょう。そして、次のチェンジセットでは、何らかの方法でデータベースを変更する必要があります。たとえば、ユーザーの連絡先電話は、VARCHAR
ではなく、国コード、市外局番、電話番号の3つのSMALLINT
列で異なる形式で保存する必要があります。
現在のデータをフェッチし、それを3つの値に分割して、それらを挿入し直すクエリを理解するのはそれほど難しいことではありません。そこで、移行が始まります。新しいフィールドを作成し、変換を実行して、最後に以前にデータを保持していたフィールドを削除できます。
そしてさらに!移行で導入された変更を元に戻す必要がある場合は、逆方向のプロセス(down
移行)を説明することもできます。誰かがVARCHAR
フィールドの形式に大きく依存していて、構造を変更したため、そのコードが期待どおりに機能していないと仮定します。したがって、migration:down
を実行すると、すべてが元に戻ります。この特定のケースでは、古いVARCHAR
列を元に戻し、値を連結してから、フィールドを削除します。
Doctrineの移行ツールは基本的にほとんどの作業を行います。スキーマを差分すると、必要なすべてのup
とdown
が生成されるため、移行が適用されたときに破損する可能性のあるデータを処理するだけで済みます。
また、移行は、チームの他の開発者に、スキーマを更新する時期についての知識を与えるものです。 schema-tool
だけでは、チームメイトはプルするたびにdoctrine:schema:update
を実行する必要があります。これは、スキーマが実際に変更されたかどうかがわからないためです。
移行を使用する場合、移行フォルダーにいくつかの更新があることが常に表示されます。つまり、スキーマを更新する必要があります。
あなたは確かにそれを安全に釘付けにしたと思います。移行を使用すると、テーブルの別の状態に戻ることができます(Gitバージョン管理で行うことができるのと同じです)。 schema updateコマンドを使用すると、テーブルのみを更新できます。これらのテーブルにすでに保存されているデータで障害が発生した場合に戻るために保持されるログはありません。正確にはわかりませんが、移行によって、更新されている対応するテーブルのデータも保存されませんか?それは私の意見では不可欠です、そうでなければそれらを使用する大きな理由はありません。
そうです、個人的には、本番環境で移行を使用する主な理由は、安全性と、おそらく少しの柔軟性にあると思います。ここでは安全が勝者だと思います:)
お役に立てれば。
編集:Symfonyのドキュメントを参照した別の回答があります: symfony2とphpを使用する本番環境でdoctrine2の移行を使用しても安全ですか
また、プレーンdoctrine移行で大規模な更新を実行することはできません。たとえば、30百万人のユーザーデータベースのインデックスを更新してみてください。アプリにアクセスできないと時間がかかるためです。