在rake任务期间无法执行原始sql'UPDATE ...'

时间:2019-04-15 09:26:54

标签: ruby-on-rails rails-activerecord

在我的耙任务中,我有这种联系

def some_connection
  ActiveRecord::Base.establish_connection({ adapter:  'mysql2', 
                                            host:     'localhost', 
                                            username: Rails.application.secrets.etalon_db_username, 
                                            password: Rails.application.secrets.etalon_db_password, 
                                            database: 'somedb' })
                    .connection
end

我需要执行此sql指令

UPDATE car_generation SET year_end = 0 WHERE id_car_generation IN (292,488,1663,6542)

运行此:

some_connection.exec_update(fix_query, nil, [])

我得到了错误:

rake aborted!
ActiveRecord::StatementInvalid: NoMethodError: undefined method `query' for nil:NilClass
Did you mean?  to_query: UPDATE car_generation
SET year_end = 0
WHERE id_car_generation IN (292,488,1663,6542...)
.rvm/gems/ruby-2.3.3@gemset/gems/activerecord-4.1.13/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:303:in `block in execute'
.rvm/gems/ruby-2.3.3@gemset/gems/activerecord-4.1.13/lib/active_record/connection_adapters/abstract_adapter.rb:378:in `block in log'
.rvm/gems/ruby-2.3.3@gemset/gems/activesupport-4.1.13/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
.rvm/gems/ruby-2.3.3@gemset/gems/activerecord-4.1.13/lib/active_record/connection_adapters/abstract_adapter.rb:372:in `log'
.rvm/gems/ruby-2.3.3@gemset/gems/activerecord-4.1.13/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:303:in `execute'
.rvm/gems/ruby-2.3.3@gemset/gems/activerecord-4.1.13/lib/active_record/connection_adapters/mysql2_adapter.rb:228:in `execute'
.rvm/gems/ruby-2.3.3@gemset/gems/activerecord-4.1.13/lib/active_record/connection_adapters/mysql2_adapter.rb:255:in `exec_delete'
lib/tasks/etalon_db_tables_population.rake:15:in `block (3 levels) in <top (required)>'
lib/tasks/etalon_db_tables_population.rake:10:in `each'
lib/tasks/etalon_db_tables_population.rake:10:in `block (2 levels) in <top (required)>'
.rvm/gems/ruby-2.3.3@gemset/gems/rake-12.3.2/exe/rake:27:in `<top (required)>'
.rvm/gems/ruby-2.3.3@gemset/bin/ruby_executable_hooks:24:in `eval'
.rvm/gems/ruby-2.3.3@gemset/bin/ruby_executable_hooks:24:in `<main>'

当我使用 execute 而不是 exec_query 时,会出现相同的错误。

但是,如果我在Rails迁移期间执行此代码,一切都会好的。

1 个答案:

答案 0 :(得分:0)

基于ActiveRecord 4.1.13的堆栈跟踪,sources显示@connectionnil

因此,您需要测试some_connection方法-最有可能返回nil。然后调查为什么无法连接数据库。

相关问题