#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
. А затем выясните, почему вы не смогли подключиться к БД.