【问题标题】:rake 0.8.7 db:migrate or db:seed runtime error, "stack level too deep"rake 0.8.7 db:migrate 或 db:seed 运行时错误,“堆栈级别太深”
【发布时间】:2013-06-26 16:40:25
【问题描述】:
  • 耙子 0.8.7
  • Rails 2.3.18
  • RubyGems 1.7.2

我研究了类似的问题,但它们不适用于这里:

  • 不在任务中做任何递归
  • 不使用 Bundler 或 RVM(如果使用 bundler 是解决方案,那我就完蛋了)
  • 不包括 ActionView::Helpers
  • 不使用名为 scryt 的 gem
  • 更改代码以使用事务并不能解决问题。

Braindead 简单的行更新。如果我将其作为迁移或种子运行,结果相同。

class AddValuesForPlanApiQuotaDaily < ActiveRecord::Migration
  def self.up

    p = Plan.find(10)
    p.api_quota_daily = 3000
    p.save!

  end
end

或来自 db/seeds.rb:

p = Plan.find(10)

if p.api_quota_daily.nil?

    p.api_quota_daily = 3000
    p.save!

end

结果:

$ rake db:seed --trace
** Invoke db:seed (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:seed
rake aborted!
stack level too deep

追踪:

/home/fun/dev/company/project/vendor/plugins/deadlock_retry/lib/deadlock_retry.rb:45:in `transaction_without_deadlock_handling'
/home/fun/dev/company/project/vendor/plugins/deadlock_retry/lib/deadlock_retry.rb:45:in `transaction'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.18/lib/active_record/transactions.rb:200:in `save!'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.18/lib/active_record/transactions.rb:208:in `rollback_active_record_state!'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.18/lib/active_record/transactions.rb:200:in `save!'
/home/fun/dev/company/project/db/seeds.rb:8
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.18/lib/active_support/dependencies.rb:171:in `load_without_new_constant_marking'
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.18/lib/active_support/dependencies.rb:171:in `load'
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.18/lib/active_support/dependencies.rb:547:in `new_constants_in'
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.18/lib/active_support/dependencies.rb:171:in `load'
/usr/lib/ruby/gems/1.8/gems/rails-2.3.18/lib/tasks/databases.rake:211
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:636:in `call'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:636:in `execute'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:631:in `each'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:631:in `execute'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:597:in `invoke_with_call_chain'
/usr/lib/ruby/1.8/monitor.rb:242:in `synchronize'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:590:in `invoke_with_call_chain'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:583:in `invoke'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2051:in `invoke_task'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `top_level'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `each'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `top_level'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2023:in `top_level'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2001:in `run'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:1998:in `run'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/bin/rake:31
/usr/bin/rake:19:in `load'
/usr/bin/rake:19

无法升级 rake 或开始为此项目使用 bundler。

【问题讨论】:

    标签: ruby-on-rails ruby rake stack-overflow


    【解决方案1】:

    另一个选项,实际上是在迁移中使用原始 SQL 来完成:

    class AddValuesToPlanApiQuotas < ActiveRecord::Migration
      def self.up
      plan_id_api_limits = {
          10 => 3000,
          20 => 3000,
          30 => 5000,
          40 => 10000,
          50 => 20000,
          60 => 35000
        }
        plan_id_api_limits.each do |k,v|
          query = "UPDATE plans set api_quota_daily = #{v} where id=#{k}"
          ActiveRecord::Base.connection.execute(query);
        end
      end
    
    end
    

    我显然不能在 0.8.7 的 rake 迁移或种子任务中使用 ActiveRecord

    【讨论】:

      【解决方案2】:

      很遗憾,我不能凭经验说话,但我想知道这个博客的内容是否可以帮助你:

      http://dalibornasevic.com/posts/5-ruby-stack-level-too-deep-systemstackerror

      基本上:

      ulimit -a | grep 'stack size'
      

      ulimit -s <some reasonably larger number>
      

      希望对您有所帮助。

      当然,我假设您在类 Unix 系统上执行此操作。

      【讨论】:

        【解决方案3】:

        这是一种可怕的做法,但我没有时间完成任务,今天不能花时间研究 rake 的问题。

        ruby script/runner db/seeds.rb
        

        塔达。

        【讨论】:

        • 可以发布Plan 模型定义吗?仅当Plan 上的api_quota_daily 有更新时才会发生这种情况。
        • 谢谢,这是一个很好的线索,但不幸的是我不能发布那个模型。但是,api_quota_daily 是我刚刚在此问题出现之前添加的列。
        • 而且,我假设您没有也没有为它定义 setter。
        猜你喜欢
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        • 2011-11-11
        • 2013-01-22
        • 1970-01-01
        • 2014-07-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多