rake db:migrate没有检测到新的迁移?

Rol*_*zzi 6 migration activerecord ruby-on-rails

经验丰富的Rails/ActiveRecord 2.1.1

  • 您创建了第一个版本(例如)ruby脚本\生成脚手架产品标题:字符串描述:text image_url:string
  • 这创建(例如)名为20080910122415_create_products.rb的迁移文件
  • 您可以使用rake db:migrate应用迁移
  • 现在,使用ruby脚本\ generate migration add_price_to_product price:decimal将产品表添加到产品表中
  • 这将创建一个名为20080910125745_add_price_to_product.rb的迁移文件
  • 如果您尝试运行rake db:migrate,它实际上将恢复第一次迁移,而不是应用下一次迁移!所以你的产品表将被销毁!
  • 但是,如果你单独使用rake,它会告诉你一个迁移正在等待

请注意,应用rake db:migrate(一旦表被销毁)将按顺序应用所有迁移.

我找到的唯一解决方法是指定新迁移的版本,如下所示:

rake db:migrate version=20080910125745
Run Code Online (Sandbox Code Playgroud)

所以我想知道:这是一个预期的新行为吗?

Jea*_*ean 1

你应该能够使用

rake db:migrate:up 
Run Code Online (Sandbox Code Playgroud)

迫使它继续前进,但随后您可能会错过团队中其他人的交错迁移

如果你跑

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

两次,它将重新应用您的所有迁移。

我在使用 SQLite 的 Windows 上遇到了相同的行为,这可能是此类环境特有的错误。

编辑——我找到了原因。在railstie database.rake 任务中,您有以下代码:

desc "Migrate the database through scripts in db/migrate. Target specific version with VERSION=x. Turn off output with VERBOSE=false."
task :migrate => :environment do
  ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
  ActiveRecord::Migrator.migrate("db/migrate/", ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
  Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
end
Run Code Online (Sandbox Code Playgroud)

然后在我的环境变量中

echo %Version% #=> V3.5.0f
Run Code Online (Sandbox Code Playgroud)

在红宝石中

ENV["VERSION"] # => V3.5.0f
ENV["VERSION"].to_i #=>0 not nil !
Run Code Online (Sandbox Code Playgroud)

因此 rake 任务调用

ActiveRecord::Migrator.migrate("db/migrate/", 0)
Run Code Online (Sandbox Code Playgroud)

在 ActiveRecord::Migrator 中我们有:

class Migrator#:nodoc:
  class << self
    def migrate(migrations_path, target_version = nil)
      case
        when target_version.nil?              then up(migrations_path, target_version)
        when current_version > target_version then down(migrations_path, target_version)
        else                                       up(migrations_path, target_version)
      end
    end
Run Code Online (Sandbox Code Playgroud)

是的,rake db:migrate VERSION=0是长版本rake db:migrate:down

编辑- 我会去更新灯塔错误,但我超级公司代理禁止我连接那里

同时,您可以在调用 migrate 之前尝试取消设置版本...