我不明白为什么会这样。我有以下迁移:
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。
答案 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
这是因为您已经创建了泄漏表并进行了迁移。再次,你将创建它,所以首先他们不应该是泄漏表。然后只有它可以创建它。因此,在创建另一个表之前必须删除泄漏表。