【问题标题】:nothing happens when I run rake db:migrate当我运行 rake db:migrate 时没有任何反应
【发布时间】:2010-11-20 01:54:53
【问题描述】:

启动了一个新的 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

【问题讨论】:

  • 你能发布你的迁移吗?
  • 我的意思是在你的问题中。 :)
  • 您从哪里运行您的 rake 任务?确保您在 rails 目录的根目录中运行,并且您甚至有一个 RakeFile。
  • 我正在从项目的 rood 目录运行命令,并且我有一个 Rakefile!
  • 你的database.yml配置正确了吗?

标签: ruby-on-rails


【解决方案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

迁移 = files.inject([]) 做 |klasses,文件|

(rdb:1) p 个文件

[]

(rdb:1) p @migrations_path

“db/迁移/”

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

[]

(rdb:1) 升

* 输出刷新 *

(rdb:1) 目录.pwd

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

(rdb:1) p 目录.pwd

"/home/raykin/campus/:/code/campus/db/data_export"

看,当前目录已更改,因为 rails 会在运行前加载所有任务 迁移(似乎有一种方法可以跳过所有负载),还有一些糟糕的任务(我昨天写的...)更改当前目录。

这完全不是 Rails 的问题,但对用户来说确实是一个困惑的结果。 希望能帮到你。

【讨论】:

    【解决方案2】:

    我有一个非常奇怪的答案,我已经确认它是真的。我们正在使用 VERSION=&lt;our application version&gt; 构建 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
    

    【讨论】:

    • 谢谢,您的回答解决了我的问题。我被设置了 VERSION 环境变量。
    猜你喜欢
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 2011-07-14
    • 2019-04-29
    相关资源
    最近更新 更多