web-dev-qa-db-ja.com

Doctrineスキーマの更新またはDoctrine移行

Doctrineスキーマの更新を実行するだけでなく、移行することの実際的な利点は何ですか?

安全?

orm:schema-tool:updateコマンド(doctrine:schema:update in Symfony)警告

この操作は、実稼働環境では実行しないでください。

しかし、これはなぜですか?もちろん、データを削除することはできますが、移行も可能です。

柔軟性?

列のデフォルトなどを追加するように移行を調整できると思いましたが、Doctrineは次の差分でスキーマとコードの不一致に気づき、変更を踏みにじるので、これはしばしば機能しません。 。

28
Tamlyn

schema-toolを使用している場合、データベースの変更履歴は保持されません。本番/ステージング環境では、これは大きな欠点です。

ライブプロジェクトに複雑なデータベース構造があると仮定しましょう。そして、次のチェンジセットでは、何らかの方法でデータベースを変更する必要があります。たとえば、ユーザーの連絡先電話は、VARCHARではなく、国コード、市外局番、電話番号の3つのSMALLINT列で異なる形式で保存する必要があります。

現在のデータをフェッチし、それを3つの値に分割して、それらを挿入し直すクエリを理解するのはそれほど難しいことではありません。そこで、移行が始まります。新しいフィールドを作成し、変換を実行して、最後に以前にデータを保持していたフィールドを削除できます。

そしてさらに!移行で導入された変更を元に戻す必要がある場合は、逆方向のプロセス(down移行)を説明することもできます。誰かがVARCHARフィールドの形式に大きく依存していて、構造を変更したため、そのコードが期待どおりに機能していないと仮定します。したがって、migration:downを実行すると、すべてが元に戻ります。この特定のケースでは、古いVARCHAR列を元に戻し、値を連結してから、フィールドを削除します。

Doctrineの移行ツールは基本的にほとんどの作業を行います。スキーマを差分すると、必要なすべてのupdownが生成されるため、移行が適用されたときに破損する可能性のあるデータを処理するだけで済みます。

また、移行は、チームの他の開発者に、スキーマを更新する時期についての知識を与えるものです。 schema-toolだけでは、チームメイトはプルするたびにdoctrine:schema:updateを実行する必要があります。これは、スキーマが実際に変更されたかどうかがわからないためです。

移行を使用する場合、移行フォルダーにいくつかの更新があることが常に表示されます。つまり、スキーマを更新する必要があります。

44
kix

あなたは確かにそれを安全に釘付けにしたと思います。移行を使用すると、テーブルの別の状態に戻ることができます(Gitバージョン管理で行うことができるのと同じです)。 schema updateコマンドを使用すると、テーブルのみを更新できます。これらのテーブルにすでに保存されているデータで障害が発生した場合に戻るために保持されるログはありません。正確にはわかりませんが、移行によって、更新されている対応するテーブルのデータも保存されませんか?それは私の意見では不可欠です、そうでなければそれらを使用する大きな理由はありません。

そうです、個人的には、本番環境で移行を使用する主な理由は、安全性と、おそらく少しの柔軟性にあると思います。ここでは安全が勝者だと思います:)

お役に立てれば。

編集:Symfonyのドキュメントを参照した別の回答があります: symfony2とphpを使用する本番環境でdoctrine2の移行を使用しても安全ですか

2
Wcool

また、プレーンdoctrine移行で大規模な更新を実行することはできません。たとえば、30百万人のユーザーデータベースのインデックスを更新してみてください。アプリにアクセスできないと時間がかかるためです。

0
dawid debinski