LoginSignup
7
7

More than 5 years have passed since last update.

Redmineの0.8.2から2.5.1へのアップグレードでrake db:migrateに失敗する場合のメモ

Last updated at Posted at 2014-06-10
  • rake db:migrateとの戦い。
  • Ruby on Railsを使ったことがあるなら分かるはず。
  • 互換性の維持って大変だ。

その1

えい。

bundle exec rake db:migrate RAILS_ENV=production

エラー。projectってクラスにinherit_members_changed?ってメソッドが無いらしい。

rake aborted!
An error has occurred, all later migrations canceled:

inherit_members_changed?' for #<Project:0xa6fb738>/srv/rails/redmine/app/models/project.rb:83:in `block in <class:Project>'
/srv/rails/redmine/app/models/project.rb:4

ソースを見る。grepするとこのメソッドが使われているのは以下の場所だけ。以下によるとprojectsというテーブルにinherit_membersってフィールドがあるはず。

app/models/project.rb
  after_save :update_inherited_members, :if => Proc.new {|project| project.inherit_members_changed?}

スキーマをみる。うむ。

db/schema.rb
  create_table "projects", :force => true do |t|
    // 
    t.boolean  "inherit_members",                :default => false, :null => false
  end

これに合わせて自力でテーブルを作成。パスワードはpassword、データベース名はredmine_production。なお、データベース名はデフォルトだとredmineだがカスタムしてある。

mysql -u root -ppassword redmine_production -e 'alter table projects add column inherit_members boolean default false not null;'

その2

えい。

bundle exec rake db:migrate RAILS_ENV=production

エラー。repositoriesってテーブルにis_defaultってカラムが無いよとのこと。

rake aborted!
An error has occurred, all later migrations canceled:

Mysql2::Error: Unknown column 'is_default' in 'where clause': SELECT  `repositories`.* FROM `repositories`  WHERE `repositories`.`project_id` = 2 AND (is_default = 1) LIMIT 1/srv/rails/redmine/app/models/project.rb:1037:in `set_or_update_position_under'
/srv/rails/redmine/app/models/project.rb:424:in `block (2 levels) in rebuild_tree!'
/srv/rails/redmine/app/models/project.rb:424:in `each'
/srv/rails/redmine/app/models/project.rb:424:in `block in rebuild_tree!'
/srv/rails/redmine/app/models/project.rb:421:in `rebuild_tree!'
/srv/rails/redmine/db/migrate/105_build_projects_tree.rb:3:in `up'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)

スキーマをみる。うむ。

db/schema.rb
  create_table "repositories", :force => true do |t|
    // 
    t.boolean  "is_default",                  :default => false
  end

自力で作成する。

mysql -u root -ppassword redmine_production -e 'alter table repositories add column is_default boolean default false;'

その3

えい。

bundle exec rake db:migrate RAILS_ENV=production

エラー。repositoriesってテーブルにis_defaultってカラム名があるのに作ろうとするなとのこと。さっき怒られたから作ったのに。

rake aborted!
An error has occurred, all later migrations canceled:

Mysql2::Error: Duplicate column name 'is_default': ALTER TABLE `repositories` ADD `is_default` tinyint(1) DEFAULT 0/srv/rails/redmine/db/migrate/20120115143100_add_repositories_is_default.rb:3:in `up'

マイグレーションの内容確認。さっきの操作と同じだ。

db/migrate/20120115143100_add_repositories_is_default.rb
class AddRepositoriesIsDefault < ActiveRecord::Migration
  def self.up
    add_column :repositories, :is_default, :boolean, :default => false
  end

  def self.down
    remove_column :repositories, :is_default
  end
end

要らないので削除(移動)。

mv db/migrate/20120115143100_add_repositories_is_default.rb db/migrate/20120115143100_add_repositories_is_default.rb.back

その4

えい。

bundle exec rake db:migrate RAILS_ENV=production

エラー。inherit_membersってテーブルにinherit_membersってカラム名があるのに作ろうとするなとのこと。さっき怒られたから作ったのに。パターンが分かってきたぞ。

rake aborted!
An error has occurred, all later migrations canceled:

Mysql2::Error: Duplicate column name 'inherit_members': ALTER TABLE `projects` ADD `inherit_members` tinyint(1) DEFAULT 0 NOT NULL/srv/rails/redmine/db/migrate/20130202090625_add_projects_inherit_members.rb:3:in `up'

マイグレーションの内容を確認。さっきSQLコマンド直叩きと同じ操作。よし。

db/migrate/20130202090625_add_projects_inherit_members.rb
class AddProjectsInheritMembers < ActiveRecord::Migration
  def up
    add_column :projects, :inherit_members, :boolean, :default => false, :null => false
  end

  def down
    remove_column :projects, :inherit_members
  end
end

というわけでこれも要らないので削除(移動)。

mv db/migrate/20130202090625_add_projects_inherit_members.rb db/migrate/20130202090625_add_projects_inherit_members.rb.back

その5

えい。

bundle exec rake db:migrate RAILS_ENV=production

よし。

あとこれも忘れずに。これについては公式サイトを参照。

bundle exec rake generate_secret_token
bundle exec rake tmp:cache:clear
bundle exec rake tmp:sessions:clear
7
7
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7