ホーム DoRuby RailsでOracle~ データベース初期化タスクをつくろう!編

RailsでOracle~ データベース初期化タスクをつくろう!編

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

TrinityTです。

今回はRails&Oracleに関する第二弾として、DBの初期化を行う独自タスクについて説明します。

普段の開発では、ダミーデータの削除やユニットテスト前の初期化など、テーブル構成を初期化したい場合にdb:migrate:resetタスクを活用して行っています。

しかし、OracleはMySQLやPostgresqlとテーブル管理の単位、ユーザなどの概念が異なるため、データベースの削除を行おうとするdb:migrate:resetタスクはエラーとなってしまいます。

本問題を解決するためのOracle用独自タスクを作ってみました。

以下の内容でファイルを${RAILS_ROOT}/lib/tasks に作成してください。

db_ora.rake

namespace :db_ora do
  namespace :migrate do
    desc "Reset Database (For Oracle)"
    task "reset" => ["truncate", "db:migrate"]

    desc "truncate all objects (For Oracle)"
    task "truncate" do
      # テーブル削除
      user_tables = UserTable.find(:all)
      user_tables.each do |table|
        ActiveRecord::Base.connection.execute("DROP TABLE #{table.table_name}")
      end
      # ビュー削除
      user_views = UserView.find(:all)
      user_views.each do |view|
        ActiveRecord::Base.connection.execute("DROP View #{view.view_name}")
      end
      # シーケンス削除
      user_sequences = UserSequence.find(:all)
      user_sequences.each do |sequence|
        ActiveRecord::Base.connection.execute("DROP SEQUENCE #{sequence.sequence_name}")
      end
    end

    # ユーザが持つテーブル一覧取得用Model
    class UserTable < ActiveRecord::Base
    end
    # ユーザが持つシーケンス一覧取得用Model
    class UserSequence < ActiveRecord::Base
    end
    # ユーザが持つビュー一覧取得用Model
    class UserView < ActiveRecord::Base
    end

    end
  end
end

コレで以下のコマンドをRAILS_ROOTで行うと、DB初期化とmigrationが行われます。

$ rake db_ora:migrate:reset

db_ora:migrate:resetタスクは作成した独自タスク(truncate)と、db:migrateタスクを組み合わせて行っています。

本タスクの流れは以下の通りです。

(1)truncateタスクを実行

(2)Oracleのシステムテーブル「user_tables」に格納されているテーブル名一覧を取得

(3)テーブルに対してDROP文を実行

(4)同様の処理をシーケンス、ビューに対して実行

(5)db:migrateタスクを実行し、dbの再構築を行う

このタスクを使うことでOracleでもdb:migrate:resetコマンドを擬似的に実行することが可能となります。

こんな感じで独自のオレオレrakeタスクを作ることは簡単なので、皆さんも是非作ってみてはいかがでしょうか!

記事を共有

最近人気な記事