【发布时间】:2015-03-16 03:24:39
【问题描述】:
我有一种情况,我需要访问 2 个数据库来构建某个数据集。这是一个使用 ActiveRecord gem 的 ruby 代码。不是导轨。我正在处理遗留数据库并使用 Ruby 开发提取脚本。
从第一个分贝
users = db1.table_db1.where("user_id in (?)", user_ids)
txn = db2.table_db2.all
在此之后我引用用户
users.each do |user|
# do something
end
尝试执行 users.each 时出现如下异常。
如果我在访问 db2 之前访问 users 变量,那么这个问题将不再存在。看起来这与急切负载有关?
Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:303:in `query'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:303:in `block in execute'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/connection_adapters/abstract_adapter.rb:373:in `block in log'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activesupport-4.1.7/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/connection_adapters/abstract_adapter.rb:367:in `log'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:303:in `execute'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/connection_adapters/mysql2_adapter.rb:228:in `execute'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/connection_adapters/mysql2_adapter.rb:232:in `exec_query'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/connection_adapters/mysql2_adapter.rb:240:in `select'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/connection_adapters/abstract/database_statements.rb:24:in `select_all'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/connection_adapters/abstract/query_cache.rb:70:in `select_all'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/querying.rb:39:in `find_by_sql'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/relation.rb:611:in `exec_queries'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/relation.rb:493:in `load'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/relation.rb:238:in `to_a'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/relation/delegation.rb:46:in `each'
file-exporter.rb:179:in `block (2 levels) in <main>'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/relation/delegation.rb:46:in `each'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/relation/delegation.rb:46:in `each'
【问题讨论】:
-
你是否在你的代码中加入了这些?您显示的代码很少,因此很难判断是否发生了其他事情。这是你所有的代码吗?如果您只执行脚本的
txn = db2.table_db2.all部分而不执行其他操作,是否会引发错误? -
问题可能出在
.each本身,但如果不向我们展示.each块中发生了什么,我们将永远无法猜测。如果您只是将每个块的内部留空而实际上并没有在其中做任何事情怎么办?还是报错吗?
标签: ruby-on-rails ruby ruby-on-rails-3 activerecord eager-loading