当我运行rake db:migrate时没有任何反应

时间:2010-11-20 01:54:53

标签: ruby-on-rails

启动了一个新的rails 3应用程序。我已经通过Scaffold生成了一些迁移。当我运行“rake db:migrate”时,即使我运行“rake --verbose db:migrate”,也没有输出到控制台

这是一个示例迁移

class CreateBicycles < ActiveRecord::Migration
  def self.up
    create_table :bicycles do |t|
      t.string :title
      t.text :Note
      t.string :Manufacturer
      t.string :Model
      t.date :year_manufactured
      t.integer :view_count
      t.timestamps
    end
  end

  def self.down
    drop_table :bicycles
  end
end

2 个答案:

答案 0 :(得分:1)

我遇到了像你这样的问题。这是我的问题描述。

尝试rake db:version,它返回0.

尝试rake db:migrate,没有任何事情发生,也没有创建表,即使db / migrate中有迁移文件也是如此。 尝试rake db:migrate VERSION = YourAnyMigrationFileTimestamp ,引发异常,不会引起此类迁移。

如果您的问题与我一样,可能是您在运行迁移任务时获得或安装了错误的rake任务,该任务更改了默认root。

要检查它,你需要调试第三个任务,(http://stackoverflow.com/questions/2663912/rails-debugging-rails-tasks可以告诉你如何调试rake任务)。

在activerecord-3.0.1 / lib / active_record / migration.rb中调试第548行,运行Dir.pwd,如果 结果不是您的应用根,必须有一些其他任务更改您的默认任务目录。

以下是我调试的内容

(rdb:1)p self.class

的ActiveRecord ::迁移

(rdb:1)n

/home/raykin/.rvm/gems/ruby-1.9.2-p0@r3local/gems/activerecord- 3.0.1 / LIB / active_record / migration.rb:550

files = Dir [“#{@ migrations_path} / [0-9] _ .rb”]

(rdb:1)n

/home/raykin/.rvm/gems/ruby-1.9.2-p0@r3local/gems/activerecord- 3.0.1 / LIB / active_record / migration.rb:552

migrations = files.inject([])do | klasses,file |

(rdb:1)p个文件

[]

(rdb:1)p @migrations_path

“分贝/迁移/”

(rdb:1)p Dir ['db / migrate / [0-9] _ .rb']

[]

(rdb:1)l

*输出已刷新*

(rdb:1)Dir.pwd

* 未知命令:“Dir.pwd”。试试“帮助”。

(rdb:1)p Dir.pwd

“/家/ raykin /校园/:/代码/校园/分贝/ data_export”

看,当前dir已经更改,导致rails在运行之前加载所有任务 迁移(似乎有一种跳过所有负载的方法),以及一些不好的任务(我昨天写的......)改变了当前的目录。

这不是Rails的问题,但对用户来说确实是一个混乱的结果。 希望可以帮到你。

答案 1 :(得分:1)

我有一个绝对奇怪的答案,我已经证实是真的。我们用VERSION=<our application version>构建了docker容器,发现我们的迁移都没有在容器内部运行,但在容器外运行正常。

长话短说:确认您没有指定任何名为VERSION的环境变量,否则迁移会将其用作target_version,如果它不是nil,则赢了不要运行所有迁移。

来自lib/activerecord/tasks/database_tasks.rb的相关代码:

  def migrate
    raise "Empty VERSION provided" if ENV["VERSION"] && ENV["VERSION"].empty?

    verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
    version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil
    scope = ENV["SCOPE"]
    verbose_was, Migration.verbose = Migration.verbose, verbose
    Migrator.migrate(migrations_paths, version) do |migration|
      scope.blank? || scope == migration.scope
    end
    ActiveRecord::Base.clear_cache!
  ensure
    Migration.verbose = verbose_was
  end