Git Product home page Git Product logo

Comments (2)

bparanj avatar bparanj commented on September 24, 2024

I reproduced the problem.

$ bin/rails db:schema:load:one --trace
** Invoke db:schema:load:one (first_time)
** Invoke db:test:purge:one (first_time)
** Invoke db:load_config (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:load_config
** Invoke db:check_protected_environments (first_time)
** Invoke db:load_config 
** Execute db:check_protected_environments
** Execute db:test:purge:one
bin/rails aborted!
TypeError: Invalid type for configuration. Expected Symbol, String, or Hash. Got nil (TypeError)

        raise TypeError, "Invalid type for configuration. Expected Symbol, String, or Hash. Got #{config.inspect}"
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/activerecord-7.1.2/lib/active_record/database_configurations.rb:183:in `resolve'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/activerecord-7.1.2/lib/active_record/connection_adapters/abstract/connection_handler.rb:324:in `resolve_pool_config'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/activerecord-7.1.2/lib/active_record/connection_adapters/abstract/connection_handler.rb:134:in `establish_connection'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/activerecord-7.1.2/lib/active_record/tasks/database_tasks.rb:516:in `with_temporary_pool'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/activerecord-7.1.2/lib/active_record/tasks/database_tasks.rb:500:in `with_temporary_connection'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/activerecord-7.1.2/lib/active_record/tasks/database_tasks.rb:491:in `with_temporary_connection_for_each'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/activerecord-7.1.2/lib/active_record/railties/databases.rake:588:in `block (5 levels) in <main>'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/rake-13.1.0/lib/rake/task.rb:281:in `block in execute'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/rake-13.1.0/lib/rake/task.rb:281:in `each'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/rake-13.1.0/lib/rake/task.rb:281:in `execute'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/rake-13.1.0/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/rake-13.1.0/lib/rake/task.rb:199:in `synchronize'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/rake-13.1.0/lib/rake/task.rb:199:in `invoke_with_call_chain'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/rake-13.1.0/lib/rake/task.rb:243:in `block in invoke_prerequisites'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/rake-13.1.0/lib/rake/task.rb:241:in `each'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/rake-13.1.0/lib/rake/task.rb:241:in `invoke_prerequisites'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/rake-13.1.0/lib/rake/task.rb:218:in `block in invoke_with_call_chain'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/rake-13.1.0/lib/rake/task.rb:199:in `synchronize'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/rake-13.1.0/lib/rake/task.rb:199:in `invoke_with_call_chain'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/rake-13.1.0/lib/rake/task.rb:188:in `invoke'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/rake-13.1.0/lib/rake/application.rb:182:in `invoke_task'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/rake-13.1.0/lib/rake/application.rb:138:in `block (2 levels) in top_level'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/rake-13.1.0/lib/rake/application.rb:138:in `each'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/rake-13.1.0/lib/rake/application.rb:138:in `block in top_level'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/rake-13.1.0/lib/rake/application.rb:147:in `run_with_threads'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/rake-13.1.0/lib/rake/application.rb:132:in `top_level'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/railties-7.1.2/lib/rails/commands/rake/rake_command.rb:27:in `block (2 levels) in perform'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/rake-13.1.0/lib/rake/application.rb:208:in `standard_exception_handling'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/railties-7.1.2/lib/rails/commands/rake/rake_command.rb:27:in `block in perform'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/railties-7.1.2/lib/rails/commands/rake/rake_command.rb:44:in `block in with_rake'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/rake-13.1.0/lib/rake/rake_module.rb:59:in `with_application'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/railties-7.1.2/lib/rails/commands/rake/rake_command.rb:41:in `with_rake'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/railties-7.1.2/lib/rails/commands/rake/rake_command.rb:20:in `perform'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/railties-7.1.2/lib/rails/command.rb:156:in `invoke_rake'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/railties-7.1.2/lib/rails/command.rb:73:in `block in invoke'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/railties-7.1.2/lib/rails/command.rb:149:in `with_argv'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/railties-7.1.2/lib/rails/command.rb:69:in `invoke'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/railties-7.1.2/lib/rails/commands.rb:18:in `<main>'
<internal:/Users/bparanj/.rvm/rubies/ruby-3.2.2/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require'
<internal:/Users/bparanj/.rvm/rubies/ruby-3.2.2/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require'
/Users/bparanj/.rvm/gems/ruby-3.2.2@50672/gems/bootsnap-1.17.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
bin/rails:4:in `<main>'
Tasks: TOP => db:schema:load:one => db:test:purge:one

from rails.

ricardotk002 avatar ricardotk002 commented on September 24, 2024

I've been digging into and it seems db:test:purge:#{name} expects a config entry for test databases otherwise it will fail. The task db:schema:load:#{name} depends on it and will fail too if that config is missing.

I kind of understand the dependency between db:schema:load:#{name} and db:test:purge:#{name} tasks, but it seems thatdb:schema:load should be updated to depend on db:test:purge too, so everything stays consistent.

I prepared this patch that should fix the issue but I'm not so sure if it's a definitive solution. I'm happy to open a PR if this is ok.

diff --git a/activerecord/lib/active_record/railties/databases.rake b/activerecord/lib/active_record/railties/databases.rake
index 08c45c8fba..1a5a1a1694 100644
--- a/activerecord/lib/active_record/railties/databases.rake
+++ b/activerecord/lib/active_record/railties/databases.rake
@@ -472,7 +472,7 @@ db_namespace = namespace :db do
     end
 
     desc "Load a database schema file (either db/schema.rb or db/structure.sql, depending on `ENV['SCHEMA_FORMAT']` or `config.active_record.schema_format`) into the database"
-    task load: [:load_config, :check_protected_environments] do
+    task load: ["db:test:purge"] do
       ActiveRecord::Tasks::DatabaseTasks.load_schema_current(ActiveRecord.schema_format, ENV["SCHEMA"])
     end
 
@@ -587,7 +587,7 @@ db_namespace = namespace :db do
         task name => %w(load_config check_protected_environments) do
           ActiveRecord::Tasks::DatabaseTasks.with_temporary_connection_for_each(env: "test", name: name) do |conn|
             db_config = conn.pool.db_config
-            ActiveRecord::Tasks::DatabaseTasks.purge(db_config)
+            ActiveRecord::Tasks::DatabaseTasks.purge(db_config) if db_config
           end
         end
       end
diff --git a/activerecord/lib/active_record/tasks/database_tasks.rb b/activerecord/lib/active_record/tasks/database_tasks.rb
index 0683e5862f..b72da4d401 100644
--- a/activerecord/lib/active_record/tasks/database_tasks.rb
+++ b/activerecord/lib/active_record/tasks/database_tasks.rb
@@ -488,6 +488,7 @@ def clear_schema_cache(filename)
       def with_temporary_connection_for_each(env: ActiveRecord::Tasks::DatabaseTasks.env, name: nil, clobber: false, &block) # :nodoc:
         if name
           db_config = ActiveRecord::Base.configurations.configs_for(env_name: env, name: name)
+          return unless db_config
           with_temporary_connection(db_config, clobber: clobber, &block)
         else
           ActiveRecord::Base.configurations.configs_for(env_name: env, name: name).each do |db_config|

After this change the sequence of tasks for both cases is the following:

$ bin/rails db:schema:load --trace
** Invoke db:schema:load (first_time)
** Invoke db:test:purge (first_time)
** Invoke db:load_config (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:load_config
** Invoke db:check_protected_environments (first_time)
** Invoke db:load_config
** Execute db:check_protected_environments
** Execute db:test:purge
** Execute db:schema:load
$ bin/rails db:schema:load:one --trace
** Invoke db:schema:load:one (first_time)
** Invoke db:test:purge:one (first_time)
** Invoke db:load_config (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:load_config
** Invoke db:check_protected_environments (first_time)
** Invoke db:load_config
** Execute db:check_protected_environments
** Execute db:test:purge:one
** Execute db:schema:load:one

from rails.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.