単体テストを考慮すると IF EXISTS オプションは追加する癖をつけた方がよい

Postgresを使用してWebサービスを開発する場合に限らないことですが、DDLを処理するプログラムを記述する場合にはRDB固有の機能であってもエラーについての対応を考慮する必要があります。特に単体テスト結合テストを自動化する場合にはエラーがテストを妨げるべきなのかどうかを判断して適宜スキップするような処理を行わなければならない事があります。具体的には、テストの開始/終了時に行うDDLなどは繰り返し処理を行っても影響がないことを十分に考慮しないとテストの自動化どころか自動化するテストプログラムの修正に悩まされることになります。

そこで常日頃から意識するべきが DROP に IF EXISTS などのオプションが存在するか、またはそれらのオプションと同等のことをストアドなどを用いて実行可能かと言うことです。

たとえば、Postgresの場合DROPには IF EXISTS オプションをつけることができます。これによりDROPを行う場合、常にテーブルが存在するかどうかを考慮することなく処理を行えます。したがって、テーブルをCREATEする場合もすでに存在しているならばDROPしてからCREATEすればよくなり、必要となる処理が単純になります。

また、これらのオプションがあるかどうかでテスト前のセットアップをどのように実行するかも決定することができます。Postgresのような IF EXISTS オプションが存在しない場合にはストアドで処理を行った方が楽な場合もありますし、プログラムでごりごり書いてしまう方が楽なこともあるでしょう。

データベースと言えばデータの入れ物という見方が強いわけですが、入れ物をどのように使うかについても検討してみるといろいろとスムーズに進むことも多いのではないでしょうか。