ReplaceSchemaタスク
Alto DBFlute のパートです。
ReplaceSchemaタスクとは?
DBスキーマの(再)構築を自動化するDBFluteタスクです。
スキーマ作成(初期化)・データ登録・データ整合性チェック というプロセスを自動化します。
ReplaceSchemaタスクの概念図
利用するメリット
- DBの初期構築や再構築の自動化、統一化
- DBFlute(ReplaceSchema)を使っているプロジェクトであれば、どこにいっても ReplaceSchema を実行することでテーブルが作成され、テストデータも一気に登録。 DB変更の開発環境への反映も、Subversion から最新状態を更新して ReplaceSchema すればDBもテストデータも最新に。再構築の初期化時はFK制約も考慮してテーブルが drop されるため、遠慮なくFK制約のメリットを享受できます。
- 独自の仕組みになりがちなDB構築処理、これを統一化することで新加入のディベロッパーの開発環境構築もスムーズに。.NETプロジェクトでも DBFlute.NET を利用していれば、Javaプロジェクトと.NETプロジェクトでメンバーが行き来しても迷うことはないでしょう。
- テストデータの一元管理、ディベロッパー間での再利用
- DB変更の影響はプログラムではなく、テストデータも大きく影響します。 分散されて定義が冗長していると、テストデータの修正だけで大きなコストとなってしまいます。 また、一元化されていても insert 文ではカラム追加もままなりません。 ReplaceSchemaはDB変更に強いテストデータ管理 を提案します。
- マスタデータに限らず、トランザクション系のテストデータをしっかりと一元管理することが大事です。 DBAの目の届かない領域にある不整合なデータでテストされてもあまり効率的ではありません。
- また、プログラムは懸命に再利用を考慮していても、各ディベロッパーが同じようなテストデータを作成してバラバラに管理していたら片手落ちです。 テストデータ自体も共有して再利用することで作成コストを抑えて、DB変更時のテストデータへの影響範囲を小さくすることが大事です。
- 再現可能なテストデータ
- そして、いつでもテストデータを基底となる元の状態に戻すことができるのも大事です。どれだけDB上でアプリ上でデータをいじっても、データを壊しても、 ReplaceSchema を実行すればすぐにもとの状態に戻すことができる。また、他の人と同じ状態のテストデータをすぐに(ローカルDBなどで)再現できる。
- ReplaceSchema は、テストデータを再現可能な状態として残していく という概念を提供します。
- テストデータの品質の維持
- さんざんデバッグしたあげく、結局のところ原因はテストデータが変だった。珍しい話ではありません。
- 例えば、正式会員だけであればメールアドレスがユニークになる、という業務的制約があるとします。 これは DBMS の制約としてはチェックできないもので、当然アプリでそうならないように制御するわけですが、 テストデータを作成するときも不整合なデータを作らないように気をつける必要があります。 しかしながら、アプリの実装のときに比べてその意識はどうしても低くなりがちで、 そして、ケアレスミスでできた不整合なデータでテストしても、そのテストは有効なものではありません。
- ReplaceSchemaではテストデータの業務的な制約をチェックするための枠組みが用意されています。 できる限りテストデータ不備によるディベロッパーの余計なコストを払わないようにしたいものです。
- しっかりとログに残る
- ログをしっかり残していることが意外に重要です。軽く見られがちなDB構築処理、スクリプトなどで手早く独自に実装されがちですが、DDLの実行やテストデータの登録など、 ケアレスミスの発生しやすい領域です。しっかりと不正なDDL、不整合なテストデータのデバッグがしやすい環境になっていることが大事です。 自分自身でのデバッグはもちろん、DDL作成者、テストデータ作成者などに発生したエラーを相談するときなど、しっかりとトレースされているログがものを言います。 それを独自の実装でやろうとすると意外にコストが掛かるもの、"DB環境構築処理の実装" にたっぷり時間をくれるマネージャはなかなかいません。
主な実行タイミング
- 開発用DBスキーマの作成
- DB変更の発生
- テストデータの変更・追加
- 結合テスト用DBスキーマ作成
- 結合テスト用テストデータの変更・追加
- 本番用DBスキーマ作成
- 本番運用後のDB変更(開発用DB)
実行コマンド
DBFluteクライアント配下の replace-schema.(bat|sh) をコマンドから実行します。 実行すると "DBが初期化される" 旨を伝えるメッセージが出ます。"y" で続行します。
環境構築
DBFluteのセットアップの後、テーブル作成のためのDDL、データ登録のためのエクセル、最終チェックのためのSQL を(処理概要のページを参考に)準備して配置することで実行可能となります。
ReplaceSchemaへの移行
既に開発中や運用中のシステムで、テストデータがテストDBにしか存在していないような状態から ReplaceSchema への移行を支援する機能が別途存在します。
処理概要
ReplaceSchemaタスクを実行すると処理が始まります。
1. スキーマ初期化
該当スキーマ上のテーブルやビューなどをdropします。
メタ情報を利用してalter文(FK制約など)やdrop文(テーブルやビュー)を実行するため、古い定義が残ったりせず全てがdropされます。 初期構築の場合は特に何も処理されません。
2. テーブル作成
配置されたDDL文を順番に実行します。
3. データ登録
配置されたデータ(エクセルやTSV、CSVなど)を順番に登録します。
4. 最終チェック
データ登録後に配置された(最終チェック用の)SQLを実行します。
主にはデータの整合性チェックをします。
運用後のDB変更
ReplaceSchema とからめて、運用後のDB変更を支援する機能もあります。
補足
実行ログ
ReplaceSchemaは、タスクの中で最もログを意識する必要のあるタスクと言えます。 エラー発生時などは "コンソールのログ" もしくは "[DBFluteクライアント]/log/dbflute.log" を参考にエラー原因を特定します。
他のO/Rマッパとの組み合わせ
このタスクはO/Rマッパーとして機能には依存せず、単独で利用可能です。 (他のO/Rマッパとも組み合わせて利用することが可能です)
SQLServerのWindows認証での注意
SQLServerに対してWindows認証で接続した場合の ReplaceSchema 実行に関して注意点があります。
実行前の調整
ReplaceSchema実行前に、ファイルコピーなどの調整(アレンジ操作)ができます。@since 0.9.8.5