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