Не удается выполнить необработанный sql ‘UPDATE …’ во время задачи rake

#ruby-on-rails #rails-activerecord

#ruby-on-rails #rails-activerecord

Вопрос:

В моей задаче rake у меня есть такое соединение

 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. Используйте ActiveRecord::Base.connection.execute(fix_query)

2. выполнение выдает ту же ошибку

3. Вместо использования ` ActiveRecord::Base.establish_connection (…)` вы должны попытаться использовать ActiveRecord::Base.connection.execute(fix_query)

4. ActiveRecord::Base.connection принимает параметры подключения из database.yml в соответствии с Rails.env, но мне нужно подключиться к другой базе данных, поэтому я использую ….establish_connection(…).connection

5. @Igor не могли бы вы добавить вам полную задачу rake. Также вы не думаете, что это было бы легко сделать ActiveRecord .

Ответ №1:

На основе трассировки стека для ActiveRecord 4.1.13, источники показывают, то @connection есть nil .

Итак, вам нужно протестировать свой some_connection метод — скорее всего, он возвращает nil . А затем выясните, почему вы не смогли подключиться к БД.