blogが便利そうだなーと思って。Gitと絡めなくても、Webアプリにおいて「現在の環境で使用するデータベース」と「有るべきスキーマの状態を示すDDLファイル」の差分を取って埋めることができればそれだけで十分使える気がする、と思って一つの運用方法を考えてみた。GitDDL使っても良いのだけど、SQL::Translatorを使うだけでもある程度は、ということで。Amon2プロジェクトの例で。MyAppとかで雛形プロジェクトを作ると、sqlディレクトリが作られて、そこにDDLを保存する雰囲気になる。そのままsql/mysql.sqlを使っていくことにする。],};のように設定し、アプリではこの設定を使ってMySQLのexampleデータベースに接続して動くようにする。テーブル作成exampleデータベースで例えば次のようにテーブルを作成。-dしてsql/mysql.sqlに突っ込んでもいいのだけど、敢えてPerlスクリプトからdumpしてみる。script/dump_schema.plを以下のように作成。$fh;これを実行すると、mysqldumpしたのと同様に以下のようなSQLが吐かれる。foreign_key_checks=1;スキーマ情報にAUTO_INCREMENTオプション要らないので無理矢理削っている。ファイルやDBIなどの入力を受け取ってschemaを保持し、producerを指定することで、そのschemaを様々な形で出力することが出来る。ここではDBIから読み取ったschemaをMySQLの形式で吐き出しただけ。スキーマ変更ここで、共同開発者がDB変更してdumpがpushされたとかでsql/mysql.sqlが以下のように変更されたとする。utf8;そうすると「DDLファイル」と「実際の手元のDB」でschemaが異なることになる。SQL::Translator::Diffで差分抽出GitDDLでも中で使っている、SQL::Translator::Diff。これが2つのschemaの差異を算出してくれる。script/diff_schema.plを以下のように作成。$diff;これで、「今の状態のDB」にどう変更をすれば「schemaファイル」と同じ状態になるか、が求められる。NULL;COMMIT;ちゃんと差分だけを出してくれる。問題ないようであればこれをそのまま流してやれば良い。オプション付きで自動適用とかにしても良いかもしれない。}}これだけで、「現在の状態」と「有るべき状態」を比較して最小限の変更で「有るべき状態」への追従ができる。まとめやっていることはGitDDLとかとたぶん変わらないのだけど、schemaの差分を抽出して適用させる、という操作の部分だけ取り出すとこんな感じになるかと。スキーマの差分はhttps://github.com/onishi/mysqldiffでも簡単に求められるけど、より細かいところまで差分だしたり、MySQL以外のDBで同じようにやりたいときはSQL::Translator::Diffが使えそうな気がする。頼りきっていると罠にハマる可能性もある。正しくSQLが生成されているか、正しい差分抽出ができているか、は常に気をつけて使う必要はある。2012年を振り返る。