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,并解决了这个问题。我通过在mysql
schema\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