Ruby on rails Rake db:迁移表已存在
我不明白为什么会这样。我有以下迁移:Ruby on rails Rake db:迁移表已存在,ruby-on-rails,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 当我第一次运行它时,它会正常运行,但当我再次运行迁移时,会抛出一个错误,
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
当我第一次运行它时,它会正常运行,但当我再次运行迁移时,会抛出一个错误,说明
泄漏
表已经存在。为什么会发生这种错误?我正在使用mysql2 gem。您的泄漏迁移中是否有相应的self.down
?如果没有,那么您可以将方法更改为def change
,然后您应该能够运行rake db:migrate:redo
,该方法将运行db:migrate:down
然后运行上次迁移的db:migrate:up
您看到该消息的原因是该表已经存在rakedb:migrate
不会删除表。基本上,它针对当前环境运行尚未运行的迁移
您可能还对以下内容感兴趣:
因此,要重新运行迁移(即db:migrate:down然后db:migrate:up),您可以运行:
rake db:migrate:reset VERSION={your migration version}
在现有文件中添加这行代码,然后再次执行rake db:migrate
def down
drop_table :leakages
end
这是因为您已经创建并迁移了泄漏表。同样地,您要创建它,所以对于第一个,它们不应该是泄漏表。只有它才能创造它。因此,在创建另一个表之前,必须删除泄漏表 您需要从SQLLite控制台中删除该表(您将丢失其中包含的所有数据)
1) 访问sql lite控制台,键入terminal
sqlite3 db/development.sqlite3
2) 放下桌子(别忘了最后一张;)
3) 退出SQLLite控制台
.quit
4) 再次运行db:migrate
bin/rake db:migrate
希望它能帮上忙,它对我很有效我将Redmine从2升级到3,并解决了这个问题。我通过在mysqlschema\u 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
#/bin/bash
echo请以SUDO的身份运行
mf=1
直至[-z“$mf”];做
回声+步进启动
#注意'bin/rake'是rake的路径,如果全局安装,请使用'rake',或者放置绝对路径
mf=$(bin/rake db:migrate RAILS_ENV=“production”2>&1 | grep-m1-oP'(?为什么要多次运行迁移?是否使用Rails generator创建迁移?迁移文件是否有时间戳前缀?添加其他表是的,我正在使用Rails generator创建迁移,并且它有时间戳前缀xi在我的迁移文件下拉表中有相应的self.down方法:泄漏是的,但我有dded在我的self.down方法中删除索引,因为drop table将自动删除所有索引。我们的数据库团队直接从mysql数据库更改了泄漏表,这就是rake未能成功完成的原因。现在我们更正了它。感谢您的迁移显示为down
,但该表存在于您的数据库中DB,这是唯一的解决方案。如果您切换了分支,则无法通过正确的迁移进行重置,因为您无法首先向下
迁移(因为它被视为向上
)
#!/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