この記事はアピリッツの技術ブログ「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タスクを作ることは簡単なので、皆さんも是非作ってみてはいかがでしょうか!