Rake db:migrate表已经存在

时间:2013-07-18 06:17:28

标签: ruby-on-rails

我不明白为什么会这样。我有以下迁移:

def self.up
  create_table :leakages do |t|
    t.integer :feature_id
    t.integer :project_id
    t.float :total
    t.date :apt_date
  end
  add_index :leakages, [:feature_id, :apt_date]
end

当我第一次运行它时它正常运行,但是当我再次运行迁移时,会抛出一个错误,说leakages表已经存在。为什么会出现此错误?我正在使用mysql2 gem。

4 个答案:

答案 0 :(得分:3)

您需要从sql lite控制台中删除该表(您将丢失其中包含的所有数据)

1)访问sql lite控制台,输入终端

sqlite3 db/development.sqlite3 

2)掉落表(不要忘记最后一个;)

drop table table_name;

3)退出sql lite控制台

.quit

4)再次运行db:migrate

bin/rake db:migrate

希望它有所帮助,它对我有用

答案 1 :(得分:2)

您的self.down迁移中是否有相应的leakages?如果没有,那么您可以将方法更改为def change,然后您应该能够运行rake db:migrate:redo运行db:migrate:down然后db:migrate:up进行上一次迁移。

您看到该消息的原因是因为该表已存在。 rake db:migrate不会删除表格。对于当前环境,它基本上运行尚未运行的迁移。

您可能也有兴趣阅读:http://guides.rubyonrails.org/migrations.html#running-specific-migrations

所以要重新运行迁移(即db:migrate:down然后db:migrate:up)你可以运行:

rake db:migrate:reset VERSION={your migration version}

答案 2 :(得分:0)

我正在将Redmine从2更新为3并坚持这个问题。我已经通过添加到mysql schema_migrations表中解决了这个问题,这个表缺少了rake抱怨的迁移名称。

这里有bash脚本来修复它:

#!/bin/bash   
echo PLEASE run AS SUDO

mf=1
until [ -z "$mf" ]; do
echo +step start
# NOTE `bin/rake` is path to rake, use `rake` if installed globally, or put absolute path
mf=$(bin/rake db:migrate RAILS_ENV="production" 2>&1 | grep -m1 -oP '(?<=db\/migrate\/)\w+(?=\.rb)')

  if [ ! -z "$mf" ] 
  then
    echo Insert migration: $mf
    echo "INSERT INTO \`schema_migrations\` (\`version\`) VALUES ('$mf');" | mysql -uroot -pSOjtHQobz6AF bitnami_redmine
  fi
  echo *step end
done

答案 3 :(得分:-1)

在现有文件中添加此行代码,然后再次执行rake db:migrate

   def down
      drop_table :leakages 
   end

这是因为您已经创建了泄漏表并进行了迁移。再次,你将创建它,所以首先他们不应该是泄漏表。然后只有它可以创建它。因此,在创建另一个表之前必须删除泄漏表。