Rails rake db:migrate没有任何影响

Jac*_*oge 30 rake activerecord ruby-on-rails rails-migrations ruby-on-rails-3

我今天制作了一个新的Rails 3应用程序,添加了一个简单的迁移,并且出于某种原因,当我执行rake db:migrate时没有任何反应.它只是暂停几秒钟,然后返回到命令提示符,没有任何错误或任何错误.Schema.rb和数据库保持空白.

什么想法可能会发生什么?我做了很多应用程序,从来没有遇到过这个问题.一切都是完全标准的设置.

tad*_*man 64

迁移不会运行的原因有几个,但最常见的是系统已经认为您定义的所有迁移都已经运行.

每次迁移都会在表中创建一个条目,schema_migrations其中的version列对应于标识号.如果要强制迁移重新运行,通常可以将其退出并重试.例如,如果您有,20100421175455_create_things.rb那么您将使用以下命令重新运行它:

rake db:migrate:redo VERSION=20100421175455
Run Code Online (Sandbox Code Playgroud)

常见的情况是您的迁移首先无法运行,例如它生成了异常,但Rails仍然认为它已完成.要强制重新运行迁移,请从schema_migrations表中删除相应的记录并rake db:migrate再次运行.

避免此类问题的一种方法是使用自动退出程序定义迁移:

class CreateThings < ActiveRecord::Migration
  def self.up
    # ... (migration) ...

  rescue
    # If an exception occurs, back out of this migration, but ignore any
    # exceptions generated there. Do the best you can.
    self.down rescue nil

    # Re-raise this exception for diagnostic purposes.
    raise
  end
end
Run Code Online (Sandbox Code Playgroud)

如果迁移中出现错误,您将看到控制台上列出的异常.由于迁移已自动回滚,因此您应该能够一次又一次地运行它,直到您正确运行它.

  • 这是不使用MySQL的一个原因; 使用支持事务模式更改的数据库(如postgres)自动处理这些内容. (5认同)
  • 我想补充一点,你可以通过删除`schema_migrations`表中的条目来专门告诉rails"迁移没有发生".例如`rails dbconsole`然后输入`DELETE FROM schema_migrations WHERE version ='...';`.小心这种方法,但它并不像听起来那么危险. (2认同)