4

変更をコミットする前に git pre-commit フックを使用して MySQL db スキーマをエクスポートし、他の開発者が git リポジトリから SQL スクリプトを使用して自分のデータベースを更新できるようにすることを検討しています。

デフォルトでは、mysqldump (私は --no-data を使用しています) は、既存のテーブルを再構築する前に削除しますが、これは私が求めているものではありません。削除して再構築する代わりにテーブルが存在する場合、テーブルを更新するために mysqldump などを実行して SQL で db スキーマを記述する方法を誰かが知っているかどうか疑問に思っています。これは遠回りかもしれませんが、誰かが私を正しい方向に向けることができれば、それは素晴らしいことです.

4

1 に答える 1

4

MySQL は更新対象をどのように認識しますか? 他の誰かのデータベースがどのような状態になるかを知ることができないため、どの更新を適用するかを知ることができません。また、更新にはスキーマの変更以上のものが必要になることがよくあります。既存のデータを変更する必要がある場合や、古いスキーマから新しいスキーマにデータを移動する必要がある場合があります。そのすべてを自動的に検出するものを取得することは決してありません。

適切な解決策は、移行を作成することです。データベースを変更するたびに、開発コピーのスキーマを自分で変更するだけでなく、以前のスキーマから新しいスキーマに更新するスクリプトを作成します (通常は、以前のスキーマにダウングレードするスクリプトも作成するため、更新をロールバックする必要がある場合)。このスクリプトは、スキーマの変更、データの移動などに必要なすべてのことを行います。

Ruby on Railsなどの最新の Web フレームワークのほとんどは、移行をサポートしているため、既に実行した移行を簡単に追跡できます。移行をサポートするフレームワークを使用していない場合は、移行を適用するための独自のスクリプトを作成することは難しくありません。各移行に番号を付けるか、日付を入れて、現在使用しているスキーマの現在のバージョンのみを格納するテーブルをデータベースに保持します。移行スクリプトを実行するときに、その現在のバージョンよりも新しい移行がある場合は、それらのスクリプトを順番に適用してから、使用しているバージョンを示すデータベース内の番号を更新します。

于 2011-04-20T16:05:00.783 に答える