QA #844
奈良 裕記 さんが4年以上前に更新
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. ■補足
!https://unofficial-redmine.org/matomo/matomo.php?idsite=1&rec=1!
戻る