プロジェクト

全般

プロフィール

QA #844

未完了

DB Migrationの実行を条件分けしたい(migration失敗回避)

奈良 裕記 さんがほぼ6年前に追加. ほぼ3年前に更新.

ステータス:
回答済
優先度:
通常
担当者:
カテゴリ:
-
対象バージョン:
-
開始日:
2018/07/17
期日:
進捗率:

0%

予定工数:

説明

■現象/要望

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

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

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

■解決策

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

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

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

 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

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

■対応状況

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

■補足


関連するチケット 1 (1件未完了0件完了)

関連している Unofficial Redmine Cooking - QA #1085: DB間差異箇所の対応(mysql/mariadb, postgresql)新規2020/03/08

操作

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

  • 説明 を更新 (差分)
  • ステータス新規 から 回答済 に変更

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

下記追加

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

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

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

奈良 裕記 さんが4年以上前に更新

奈良 裕記 さんが4年以上前に更新

奈良 裕記 さんが約4年前に更新

  • 関連している QA #1085: DB間差異箇所の対応(mysql/mariadb, postgresql) を追加

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

他の形式にエクスポート: Atom PDF