15

私は、さまざまなプロジェクトに出入りする小さな開発チームで git を使い始めました。Wordpress を使い始めるまでは、十分に機能していました。Wordpress は MySQL に多くの構成を保存するため、それをコミットに含める必要があると判断しました。

これは、2 人がプラグインに変更を加えてコミットするまでは (コミット前に msyql ダンプを使用し、チェックアウト後にダンプされたファイルを mysql にプッシュして) 十分に機能し、その後すべてが再び壊れました。

私は見つけられるすべての解決策を検討しましたが、Liquibase が最も近い選択肢であると考えましたが、私たちにはうまくいきませんでした。XML でスキーマを指定する必要がありますが、DB にデータ/テーブル/変更を自動的に挿入するプラグインを使用しているため、これは実際には不可能です。
数日以内に報奨金をかけて、次の「ゴルディロックス ソリューション」を持っている人がいるかどうかを確認する予定です。

質問:
MySQL データベースをセマンティックにバージョン管理する方法はありますか (diff を使用しないでください)現在のものに)開発者が記述したスキーマファイルを必要とせず、gitを使用してマージできるもの.

このような問題を抱えているのは私だけではないことはわかっていますが、解決策を持っている人がいるといいのですが?

4

1 に答える 1

4

データベースのバージョン管理を処理する適切な方法は、追加のみのバージョン スクリプトを使用することです。この性質により、各ブランチが同じファイルに追加されるため、常に競合します。あなたはあれが欲しい。これにより、開発者は、互いの変更がデータの永続性にどのように影響するかを認識できます。ただし、Rerere を使用すると、競合を 1 回だけ解決することができます。(rerere 共有に関する私のブログ投稿を参照してください: http://dymitruk.com/blog/2012/02/05/branch-per-feature/ )

バージョン番号をチェックし、スキーマを変更するか、ルックアップ データなどを変更してから、バージョン番号をインクリメントする if then 句内に各変更をラップし続けます。変更ごとにこれを続けるだけです。

疑似コードの例を次に示します。

if version table doesn't exist
  create version table with 1 column called "version"
  insert the a row with the value 0 for version
end if
-- now someone adds a feature that adds a members table
if version in version table is 0
  create table members with columns id, userid, passwordhash, salt
    with non-clustered index on the userid and pk on id
  update version to 1
end if
-- now some one adds a customers table
if version in version table is 1
  create table customers with columns id, fullname, address, phone
    with non-clustered index on fullname and phone and pk on id
  update version to 2
end if
-- and so on

これの利点は、静的言語を使用している場合、テスト プロジェクトのビルドが成功した後にこのスクリプトを自動的に実行できることです。これにより、常に最新の状態にロールアップされます。最新バージョンに更新したばかりであれば、すべての受け入れテストに合格するはずです。

問題は、2 つの異なるブランチで同時に作業するにはどうすればよいかということです。私が過去に行ったことは、データベース名がブランチ名で区切られた新しいインスタンスをスピンアップしただけです。構成ファイルが消去され (git smudge/clean を参照)、接続文字列がそのブランチの新規または既存のインスタンスを指すように設定されます。

ORM を使用している場合は、このスクリプト生成を自動化できます。たとえば、nhibernate を使用すると、db スキーマにまだ反映されていないグラフの変更を SQL スクリプトとしてエクスポートできます。したがって、customer クラスのマッピングを追加すると、NHibernate でテーブル作成スクリプトを生成できるようになります。if-then ラッパーの追加をスクリプト化するだけで、フィーチャー ブランチで自動化されます。

統合ブランチとリリース候補ブランチにはいくつかの特別な要件があり、これらのブランチをリセットする場合はデータベースを消去して再作成する必要があります。git branch --contains新しいリビジョンが古いリビジョンであることを確認することで、フックで簡単に実行できます。そうでない場合は、ワイプして再生します。

それが明確であることを願っています。これは過去にうまく機能しており、各開発者が自分のマシン上でデータベースの独自のインスタンスを作成および破棄できる必要があります。

于 2012-07-17T07:52:56.737 に答える