プロジェクト

全般

プロフィール

QA #844

奈良 裕記 さんがほぼ5年前に更新

h3. ■現象/要望 

 DB Migrationでカラム、インデックスを追加する場合、 
 既に作成されていると、二重作成によりmigrationが失敗する。 
 (Redmine本体では通常発生しないが、プラグイン等により発生する場合がある) 
 migration実行時に二重作成を回避したい。 

 DBがMysql/Postgressの場合のみ実行 

 Rails のバージョンから判断して実行 

 h3. ■解決策 

 Migration実行時に存在チェックする事で、migration失敗を回避できる。 

 サンプル 
 (カラムが既に作成されている場合には追加しない。) 

 https://github.com/redmine/redmine/blob/master/db/migrate/20151031095005_add_projects_default_version_id.rb 

 <pre><code class="ruby"> 
  def self.up 
     # Don't try to add the column if redmine_default_version plugin was used 
     unless column_exists?(:projects, :default_version_id, :integer) 
       add_column :projects, :default_version_id, :integer, :default => nil 
     end 
   end 
 </code></pre> 


 RAILSDOC抜粋 
 http://railsdoc.com/migration 

 カラムが存在するかチェック(column_exists?) 
 column_exists?(テーブル名, カラム名 [, 型, オプション]) 

 インデックスが存在するかチェック(index_exists?) 
 index_exists?(テーブル名, カラム名 [, オプション]) 

 テーブルが存在するかチェック(table_exists?) 

 DBがMysql/Postgressの場合のみ実行 

  if Redmine::Database.mysql? 
   
  if Redmine::Database.postgresql? 

 サンプル: https://github.com/clear-code/redmine_full_text_search/blob/master/db/migrate/20190603061606_create_fts_targets.rb 

 Rails のバージョンから判断して実行 

  

 if Rails::VERSION::MAJOR == 4 

 h3. ■対応状況 

 migration中の条件分岐により対応可能 

 h3. ■補足 

戻る