5

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

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

4 回答 4

7

您需要从 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

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

于 2014-03-06T19:14:35.577 回答
2

self.down您的leakages迁移中有对应的吗?如果没有,那么您可以将方法更改为def change,那么您应该能够运行rake db:migrate:redowhich runs db:migrate:downthendb: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}
于 2013-07-18T06:24:18.583 回答
1

我将 Redmine 从 2 更新到 3 并遇到了这个问题。我已经通过在 mysqlschema_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
于 2018-05-18T12:07:11.480 回答
-1

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

   def down
      drop_table :leakages 
   end

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

于 2013-07-18T07:03:43.967 回答