首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RAK0.8.7db:迁移或db:种子运行时错误,“堆栈级别太深”

RAK0.8.7db:迁移或db:种子运行时错误,“堆栈级别太深”
EN

Stack Overflow用户
提问于 2013-06-26 16:40:25
回答 3查看 600关注 0票数 1
  • 耙0.8.7
  • Rails 2.3.18
  • RubyGems 1.7.2

我曾研究过类似的问题,但这些问题并不适用于此:

  • 在任务中不执行任何递归。
  • 不使用Bundler或RVM (如果使用bundler是解决方案,那么我就完了)
  • 不包括ActionView::Helpers
  • 不使用名为scrubyt的宝石
  • 修改代码以使用事务并不能修复它。

简单的行更新。同样的结果,如果我运行它作为一个迁移或种子。

代码语言:javascript
复制
class AddValuesForPlanApiQuotaDaily < ActiveRecord::Migration
  def self.up

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

  end
end

或来自db/seeds.rb:

代码语言:javascript
复制
p = Plan.find(10)

if p.api_quota_daily.nil?

    p.api_quota_daily = 3000
    p.save!

end

结果:

代码语言:javascript
复制
$ rake db:seed --trace
** Invoke db:seed (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:seed
rake aborted!
stack level too deep

追踪:

代码语言:javascript
复制
/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。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-26 17:07:08

另一个实际使用单词的选项是,在迁移中使用原始SQL执行此操作:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-06-26 20:04:41

不幸的是,我不能凭经验发言,但我不知道这个博客的内容是否能帮助你:

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

基本上:

代码语言:javascript
复制
ulimit -a | grep 'stack size'

代码语言:javascript
复制
ulimit -s <some reasonably larger number>

希望这能有所帮助。

当然,我假设您是在类似Unix的系统上这样做的。

票数 1
EN

Stack Overflow用户

发布于 2013-06-26 16:47:24

这是可怕的练习,但我没有时间在这个任务上,不能花在今天的研究问题与耙。

代码语言:javascript
复制
ruby script/runner db/seeds.rb

太棒了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17325817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档