その他
    ホーム 技術発信 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タスクを作ることは簡単なので、皆さんも是非作ってみてはいかがでしょうか!