3

同様のワークフローが一般的であることは確かですが、私の検索では文書化された例は見つかりませんでした。

目標:

  1. ソース管理の利点をすべて享受できるように、すべての mysql (v5.1+) データベース定義を git で管理したいと考えています。
  2. スクリプトを編集してスクリプトを実行することにより、データベースへの変更を定義して、mysql シェルや GUI アプリではなく、選択したエディター (vim) でデータベース定義を編集できるようにしたいと考えています。

余談: 私は現在 mysql シェルを使用していますが、vim を使用して、シェルで扱いにくくなるルーチンとイベントを維持したいと考えています。

プラン:

初期スクリプトを取得するために「--no-data」オプションを指定して初期ダンプを実行しますが、それ以降のワークフローは、次のようにしたいと考えています: スクリプトの編集 -> コミット -> スクリプトの実行: データベースへの変更の実行 - > ddl をダンプ -> コミット。

警告:

次のようにデータベースをダンプすると:

mysqldump -u [user] -p [password] --no-data --routines > ddl.sql

以下が含まれます。

DROP TABLE IF EXISTS `[table]`; CREATE TABLE `[table]` ([table definition])

明らかに、スクリプトを実行するとテーブルが破棄され、再作成されます。私がしたいのは、テーブルが存在する場合は定義の変更でテーブルを更新し、そうでない場合は定義でテーブルを作成することです。複数の重複ブロックを維持するよりも、再利用される 1 つの [table]([table dfinition]) ブロックでテーブルを定義することをお勧めします。

同じスクリプトを使用してデータベースを更新し、別の環境で (データなしで) データベース定義を再作成できるように、初期ダンプ構文またはスクリプトを変更するにはどうすればよいですか?

4

1 に答える 1

1

ご指摘のとおり、mysqldumping だけでは機能しません。

通常、データベース構造への変更を保存する必要があります。したがって、保存する代わりに:

// commit 1
// foo.sql
CREATE TABLE foo ( foo_id INT );

// commit 2
// foo.sql
CREATE TABLE foo ( foo_id INT, foo_val INT );

次のようなものを保存する必要があります。

// commit 1
// foo_1.sql
CREATE TABLE foo ( foo_id INT );

// commit 2
// foo_2.sql
ALTER TABLE foo ADD COLUMN ( foo_val INT );

次に、実行できるスクリプトが必要です

  • foo_1.sql
  • foo_2.sql

正しい順序で。

up() およびdown () オプションを持つスクリプトを作成すると、移行を順方向 (テーブルの作成、列の追加) および逆方向(列の削除、テーブルの削除)に実行できるようになります。

データベースの変更に依存するブランチをチェックアウトする前に、後方スクリプトを実行することを忘れないでください。

于 2012-10-19T01:01:48.673 に答える