【问题标题】:What would cause this migration to hang?什么会导致此迁移挂起?
【发布时间】:2025-12-21 22:35:12
【问题描述】:

我正在尝试将旧的 1.2.6 Rails 应用程序升级到 2.3.8,但在迁移时遇到了一些障碍。也就是说,如果我在迁移中有类似 ModelName.create(:foo => "bar") 的内容,则迁移不会完成。它不会遇到无限循环或任何东西。它只是拒绝完成迁移。

这是一些示例代码。

这行得通:

class CreateNewsArticles < ActiveRecord::Migration
  def self.up
    create_table :news_articles, :force => true do |t|
      t.string  "name"
      t.string  "image"
      t.text    "body"
      t.boolean "featured", :default => "0"
      t.integer "position"
      t.timestamps
    end
    # Section.create(:name => 'News Articles', :controller => 'news_articles', :description => 'Add, edit, and delete news articles.')
  end

  def self.down
    drop_table :news_articles
    Section.find_by_name('News Articles').destroy
  end
end

取消注释 Section.create(...) 意味着迁移永远不会完成。

这是 rake db:migrate --trace: 的输出:

** Invoke db:migrate (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:migrate
==  CreateNewsArticles: migrating =============================================
-- create_table(:news_articles, {:force=>true})
   -> 0.0531s

在注释掉 Section.create 之后

** Invoke db:migrate (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:migrate
==  CreateNewsArticles: migrating =============================================
-- create_table(:news_articles, {:force=>true})
   -> 0.0479s
==  CreateNewsArticles: migrated (0.0481s) ====================================

** Invoke db:schema:dump (first_time)
** Invoke environment 
** Execute db:schema:dump

我已经在另一台计算机上尝试过,它可以工作。相同版本的 rake、相同版本的 ruby​​ 和 rails 被冻结。

rake --VERSION:rake, version 0.8.7,ruby -v:ruby 1.8.6 (2010-02-05 patchlevel 399) [i686-darwin10.3.0],rails -v:Rails 2.3.8

有人有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    您可以从不同的原因看到相同的症状:如果您正在运行,迁移可能会挂起:

    $ rails console --sandbox
    

    在另一个进程中。退出控制台进程允许迁移完成。

    【讨论】:

    • 这解决了我的问题 - 但我的问题在它到达线路之前就挂了,这与 OP 的问题形成鲜明对比。控制台冻结后,我无法退出控制台中的进程 - Ctrl+C 没有任何效果。必须关闭终端窗口才能终止该进程。一旦我退出另一个终端中的沙盒控制台,我的数据库最终被搞砸了——回滚/迁移不起作用,因为原始迁移已被终止,而无法优雅地终止。在我向上迁移之前,我必须回滚到创建导致问题的表的迁移。
    【解决方案2】:

    我有同样的问题..我发现有空闲事务阻止了对该表的进一步查询..

    运行:

    heroku pg:ps
    

    查看数据库进程。您将不得不终止空闲进程:

    heroku pg:kill 913 --force -a
    

    (913 是空闲进程的 ID -> 根据您的需要更改它

    【讨论】:

      【解决方案3】:

      显然使用 ruby​​ 1.8.6-p399 是罪魁祸首。切换到 1.8.6-p369 解决了它。

      【讨论】:

      • 您愿意详细说明为什么这已经解决了吗?或者您在哪里找到了该解决方案!
      【解决方案4】:

      您也可以尝试在迁移中定义条形截面模型。

      【讨论】:

      • 是迁移找不到Section模型的问题吗?它会直接退出而不抛出错误,这似乎很奇怪。
      • 我不确定,这只是我在迁移变得奇怪时尝试的东西。如果模型包含有关旧模式的信息,则特别有用。
      最近更新 更多