【问题标题】:ActiveRecord::StatementInvalid. PG ErrorActiveRecord::StatementInvalid。 PG错误
【发布时间】:2012-04-16 08:24:59
【问题描述】:

我正在尝试使用 Project.find(id)Project 模型中找到一个项目,但它给了我 ActiveRecord::StatementInvalid 错误

完整的跟踪-

 PG::Error: ERROR: prepared statement "a1" already exists : SELECT COUNT(*) FROM pg_class c LEFT JOIN pg_namespace n ON n.oid = c.relnamespace WHERE c.relkind in ('v','r') AND c.relname = $1 AND n.nspname = ANY (current_schemas(false))
/home/deploy/.rvm/gems/ruby-1.9.2-p290@submit_contactpl/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:1180:in `prepare'
/home/deploy/.rvm/gems/ruby-1.9.2-p290@submit_contactpl/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:1180:in `prepare_statement'
/home/deploy/.rvm/gems/ruby-1.9.2-p290@submit_contactpl/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:1144:in `exec_cache'
/home/deploy/.rvm/gems/ruby-1.9.2-p290@submit_contactpl/gems/activerecord-     3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:664:in `block in exec_query'
/home/deploy/.rvm/gems/ruby-1.9.2-p290@submit_contactpl/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract_adapter.rb:280:in `block in log'
/home/deploy/.rvm/gems/ruby-1.9.2-p290@submit_contactpl/gems/activesupport-3.2.2/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/home/deploy/.rvm/gems/ruby-1.9.2-p290@submit_contactpl/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract_adapter.rb:275:in `log'
/home/deploy/.rvm/gems/ruby-1.9.2-p290@submit_contactpl/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:662:in `exec_query'
/home/deploy/.rvm/gems/ruby-1.9.2-p290@submit_contactpl/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:797:in `table_exists?'
/home/deploy/.rvm/gems/ruby-1.9.2-p290@submit_contactpl/gems/activerecord-3.2.2/lib/active_record/connection_adapters/schema_cache.rb:30:in `table_exists?'
/home/deploy/.rvm/gems/ruby-1.9.2-p290@submit_contactpl/gems/activerecord-3.2.2/lib/active_record/model_schema.rb:223:in `table_exists?'
/home/deploy/.rvm/gems/ruby-1.9.2-p290@submit_contactpl/gems/activerecord-3.2.2/lib/active_record/attribute_methods/primary_key.rb:75:in `get_primary_key'
/home/deploy/.rvm/gems/ruby-1.9.2-p290@submit_contactpl/gems/activerecord-3.2.2/lib/active_record/attribute_methods/primary_key.rb:60:in `reset_primary_key'
/home/deploy/.rvm/gems/ruby-1.9.2-p290@submit_contactpl/gems/activerecord-3.2.2/lib/active_record/attribute_methods/primary_key.rb:49:in `primary_key'
/home/deploy/.rvm/gems/ruby-1.9.2-p290@submit_contactpl/gems/activerecord-3.2.2/lib/active_record/model_schema.rb:230:in `block in columns'
/home/deploy/.rvm/gems/ruby-1.9.2-p290@submit_contactpl/gems/activerecord-3.2.2/lib/active_record/model_schema.rb:228:in `map'
/home/deploy/.rvm/gems/ruby-1.9.2-p290@submit_contactpl/gems/activerecord-3.2.2/lib/active_record/model_schema.rb:228:in `columns'
/home/deploy/.rvm/gems/ruby-1.9.2-p290@submit_contactpl/gems/activerecord-3.2.2/lib/active_record/model_schema.rb:237:in `columns_hash'
/home/deploy/.rvm/gems/ruby-1.9.2-p290@submit_contactpl/gems/activerecord-3.2.2/lib/active_record/relation/delegation.rb:7:in `columns_hash'
/home/deploy/.rvm/gems/ruby-1.9.2-p290@submit_contactpl/gems/activerecord-3.2.2/lib/active_record/relation/finder_methods.rb:330:in `find_one'
/home/deploy/.rvm/gems/ruby-1.9.2-p290@submit_contactpl/gems/activerecord-3.2.2/lib/active_record/relation/finder_methods.rb:311:in `find_with_ids'
/home/deploy/.rvm/gems/ruby-1.9.2-p290@submit_contactpl/gems/activerecord-3.2.2/lib/active_record/relation/finder_methods.rb:107:in `find'
/home/deploy/.rvm/gems/ruby-1.9.2-p290@submit_contactpl/gems/activerecord-3.2.2/lib/active_record/querying.rb:5:in `find'
/home/deploy/submit_contactpl/app/workers/php_worker.rb:5:in `perform'

php_worker 的第 5 行是

 project = Project.find(project_id)

可能是什么问题?你能不能给它遮光。可能的解决方案是什么

【问题讨论】:

    标签: sql ruby ruby-on-rails-3 postgresql activerecord


    【解决方案1】:

    只需要

     task "resque:setup" => :environment do
      #ENV['QUEUE'] = '*'
    
      Resque.before_fork = Proc.new { ActiveRecord::Base.establish_connection }
     end
    

    在您的resque.rake 文件中

    【讨论】:

    • 这个不是应该进入 config/initializers/resque.rb ,这样每次 resque 分叉时它都处于活动状态?
    • 这到底是在做什么?为什么我们必须这样做?它在 Resque 或 Rails 的未来版本中是否已修复(无论 bug 存在于何处)?
    【解决方案2】:

    这是您的 Ruby 堆栈中某处的错误。

    它正在尝试准备一个名为“a1”的语句,该语句正在检查表/视图定义(可能是针对您的“项目”表)。它发现已经存在同名的预处理语句并吐出错误。它尝试准备的查询很好 - 它返回有多少表具有给定名称的计数。

    要么它没有正确跟踪其准备好的语句,要么它认为它已被删除并且实际上并没有。我会更新 rails 和 activerecord 并检查错误报告。

    【讨论】:

      猜你喜欢
      • 2017-06-18
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 2018-03-08
      • 1970-01-01
      • 2022-10-06
      • 2019-01-20
      • 1970-01-01
      相关资源
      最近更新 更多