Rake db:migrate 表已经存在

use*_*618 4 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
Run Code Online (Sandbox Code Playgroud)

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

Gon*_*tti 5

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

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

sqlite3 db/development.sqlite3 
Run Code Online (Sandbox Code Playgroud)

2)删除表(不要忘记最后一个;)

drop table table_name;
Run Code Online (Sandbox Code Playgroud)

3) 退出 sql lite 控制台

.quit
Run Code Online (Sandbox Code Playgroud)

4) 再次运行 db:migrate

bin/rake db:migrate
Run Code Online (Sandbox Code Playgroud)

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


vee*_*vee 2

您的迁移self.down中有对应的吗?leakages如果没有,那么您可以将方法更改为def change,那么您应该能够运行上次迁移时运行rake db:migrate:redo的方法。db:migrate:downdb: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}
Run Code Online (Sandbox Code Playgroud)