oldmoe / litestack

MIT License
1.02k stars 56 forks source link

Creating a new repo causes an error when running `bin/rails dbconsole` #88

Closed fangherk closed 7 months ago

fangherk commented 7 months ago

I ran the following commands and ran into a dbconsole error.

  1. I generated a brand new rails repo using ruby 3.2.1 and rails 7.1.3.
  2. bundle add litestack.
  3. bundle install litestack.
  4. rails generate litestack:install
  5. bin/rails dbconsole
/Users/herk/.rbenv/versions/3.2.1/lib/ruby/gems/3.2.0/gems/railties-7.1.3/lib/rails/commands/dbconsole/dbconsole_command.rb:71:in `find_cmd_and_exec': undefined method `find_cmd_and_exec' for #<ActiveRecord::ConnectionAdapters::LitedbAdapter:0x0000000105cd0658 @transaction_manager=#<ActiveRecord::ConnectionAdapters::TransactionManager:0x0000000105dba5a0 @stack=[], @connection=#<ActiveRecord::ConnectionAdapters::LitedbAdapter:0x0000000105cd0658 ...>, @has_unmaterialized_transactions=false, @materializing_transactions=false, @lazy_transactions_enabled=true>, @query_cache={}, @query_cache_enabled=false, @query_cache_max_size=100, @raw_connection=#<Litedb:0x0000000105a3e0e8 @tracefunc=nil, @authorizer=nil, @encoding=#<Encoding:UTF-8>, @busy_handler=#<Proc:0x0000000105a3dd50 /Users/herk/.rbenv/versions/3.2.1/lib/ruby/gems/3.2.0/gems/litestack-0.4.2/lib/litestack/litedb.rb:110>, @collations={}, @functions={}, @results_as_hash=true, @type_translation=nil, @type_translator=#<Proc:0x00000001046fecd0 /Users/herk/.rbenv/versions/3.2.1/lib/ruby/gems/3.2.0/gems/sqlite3-1.7.0-arm64-darwin/lib/sqlite3/database.rb:747 (lambda)>, @readonly=false, @default_transaction_mode=:deferred, @running=true, @collecting_metrics=nil>, @unconfigured_connection=nil, @logger=#<ActiveSupport::BroadcastLogger:0x0000000104e96330 @broadcasts=[#<ActiveSupport::Logger:0x00000001052f3d60 @level=0, @progname=nil, @default_formatter=#<Logger::Formatter:0x0000000104e9ab60 @datetime_format=nil>, @formatter=#<ActiveSupport::Logger::SimpleFormatter:0x0000000104e96a38 @datetime_format=nil, @thread_key="activesupport_tagged_logging_tags:14780">, @logdev=#<Logger::LogDevice:0x00000001052f4800 @shift_period_suffix="%Y%m%d", @shift_size=104857600, @shift_age=1, @filename="/Users/herk/Projects/broken_litestack/log/development.log", @dev=#<File:/Users/herk/Projects/broken_litestack/log/development.log>, @binmode=false, @mon_data=#<Monitor:0x0000000104e9a8b8>, @mon_data_owner_object_id=4820>, @local_level_key=:logger_thread_safe_level_14760>], @progname="Broadcast", @formatter=#<ActiveSupport::Logger::SimpleFormatter:0x0000000104e96a38 @datetime_format=nil, @thread_key="activesupport_tagged_logging_tags:14780">>, @config={:adapter=>"litedb", :pool=>5, :idle_timeout=>0, :database=>"/Users/herk/Projects/broken_litestack/db/development/data.sqlite3", :strict=>true}, @connection_parameters={:adapter=>"litedb", :pool=>5, :idle_timeout=>0, :database=>"/Users/herk/Projects/broken_litestack/db/development/data.sqlite3", :strict=>true, :results_as_hash=>true}, @owner=#<Thread:0x000000010047b110 run>, @instrumenter=#<ActiveSupport::Notifications::Instrumenter:0x00000001055f42a8 @id="b3b75dbfd3570b886693", @notifier=#<ActiveSupport::Notifications::Fanout (19 patterns)>>, @pool=#<ActiveRecord::ConnectionAdapters::ConnectionPool:0x0000000105c906e8 @mon_data=#<Monitor:0x00000001055b5008>, @mon_data_owner_object_id=14720, @query_cache_enabled=#<Concurrent::Map:0x00000001055b4e28 entries=0 default_proc=#<Proc:0x00000001055b4dd8 /Users/herk/.rbenv/versions/3.2.1/lib/ruby/gems/3.2.0/gems/activerecord-7.1.3/lib/active_record/connection_adapters/abstract/query_cache.rb:35>>, @pool_config=#<ActiveRecord::ConnectionAdapters::PoolConfig:0x0000000105eb8218 @_mutex=#<Thread::Mutex:0x00000001055f5ae0>, @connection_class=ActiveRecord::Base, @db_config=#<ActiveRecord::DatabaseConfigurations::HashConfig:0x00000001055fb3f0 @env_name="development", @name="primary", @configuration_hash={:adapter=>"litedb", :pool=>5, :idle_timeout=>0, :database=>"./db/development/data.sqlite3"}>, @role=:writing, @shard=:default, @pool=#<ActiveRecord::ConnectionAdapters::ConnectionPool:0x0000000105c906e8 ...>, @schema_reflection=#<ActiveRecord::ConnectionAdapters::SchemaReflection:0x00000001059fcdc8 @cache=#<ActiveRecord::ConnectionAdapters::SchemaCache:0x0000000105dba3c0 @columns={}, @columns_hash={}, @primary_keys={}, @data_sources={}, @indexes={}, @database_version=#<ActiveRecord::ConnectionAdapters::AbstractAdapter::Version:0x0000000105b1d108 @version=[3, 44, 2], @full_version_string=nil>, @version=nil>, @cache_path="db/schema_cache.yml">>, @db_config=#<ActiveRecord::DatabaseConfigurations::HashConfig:0x00000001055fb3f0 @env_name="development", @name="primary", @configuration_hash={:adapter=>"litedb", :pool=>5, :idle_timeout=>0, :database=>"./db/development/data.sqlite3"}>, @role=:writing, @shard=:default, @checkout_timeout=5.0, @idle_timeout=nil, @size=5, @thread_cached_conns=#<Concurrent::Map:0x00000001055b4928 entries=1 default_proc=nil>, @connections=[#<ActiveRecord::ConnectionAdapters::LitedbAdapter:0x0000000105cd0658 ...>], @automatic_reconnect=true, @now_connecting=0, @threads_blocking_new_connections=0, @available=#<ActiveRecord::ConnectionAdapters::ConnectionPool::ConnectionLeasingQueue:0x0000000105eb43e8 @lock=#<ActiveRecord::ConnectionAdapters::ConnectionPool:0x0000000105c906e8 ...>, @cond=#<MonitorMixin::ConditionVariable:0x00000001055b4680 @monitor=#<Monitor:0x00000001055b5008>, @cond=#<Thread::ConditionVariable:0x00000001055b4608>>, @num_waiting=0, @queue=[]>, @lock_thread=false, @async_executor=nil, @reaper=#<ActiveRecord::ConnectionAdapters::ConnectionPool::Reaper:0x00000001055b4450 @pool=#<ActiveRecord::ConnectionAdapters::ConnectionPool:0x0000000105c906e8 ...>, @frequency=60.0>>, @idle_since=1208409.306946, @visitor=#<Arel::Visitors::SQLite:0x00000001059fdfc0 @dispatch={}, @connection=#<ActiveRecord::ConnectionAdapters::LitedbAdapter:0x0000000105cd0658 ...>>, @statements=#<ActiveRecord::ConnectionAdapters::SQLite3Adapter::StatementPool:0x00000001059fdac0 @cache={}, @statement_limit=1000>, @lock=ActiveSupport::Concurrency::NullLock, @prepared_statements=true, @advisory_locks_enabled=true, @default_timezone=nil, @raw_connection_dirty=false, @verified=nil, @memory_database=false, @use_insert_returning=true, @schema_cache=#<ActiveRecord::ConnectionAdapters::BoundSchemaReflection:0x00000001059fccb0 @schema_reflection=#<ActiveRecord::ConnectionAdapters::SchemaReflection:0x00000001059fcdc8 @cache=#<ActiveRecord::ConnectionAdapters::SchemaCache:0x0000000105dba3c0 @columns={}, @columns_hash={}, @primary_keys={}, @data_sources={}, @indexes={}, @database_version=#<ActiveRecord::ConnectionAdapters::AbstractAdapter::Version:0x0000000105b1d108 @version=[3, 44, 2], @full_version_string=nil>, @version=nil>, @cache_path="db/schema_cache.yml">, @connection=#<ActiveRecord::ConnectionAdapters::LitedbAdapter:0x0000000105cd0658 ...>>> (NoMethodError)

        ActiveRecord::Base.connection.find_cmd_and_exec(commands, *args)
                                     ^^^^^^^^^^^^^^^^^^
    from /Users/herk/.rbenv/versions/3.2.1/lib/ruby/gems/3.2.0/gems/litestack-0.4.2/lib/railties/rails/commands/dbconsole.rb:50:in `start'
    from /Users/herk/.rbenv/versions/3.2.1/lib/ruby/gems/3.2.0/gems/railties-7.1.3/lib/rails/commands/dbconsole/dbconsole_command.rb:9:in `start'
    from /Users/herk/.rbenv/versions/3.2.1/lib/ruby/gems/3.2.0/gems/railties-7.1.3/lib/rails/commands/dbconsole/dbconsole_command.rb:93:in `perform'
    from /Users/herk/.rbenv/versions/3.2.1/lib/ruby/gems/3.2.0/gems/thor-1.3.0/lib/thor/command.rb:28:in `run'
    from /Users/herk/.rbenv/versions/3.2.1/lib/ruby/gems/3.2.0/gems/thor-1.3.0/lib/thor/invocation.rb:127:in `invoke_command'
    from /Users/herk/.rbenv/versions/3.2.1/lib/ruby/gems/3.2.0/gems/railties-7.1.3/lib/rails/command/base.rb:178:in `invoke_command'
    from /Users/herk/.rbenv/versions/3.2.1/lib/ruby/gems/3.2.0/gems/thor-1.3.0/lib/thor.rb:527:in `dispatch'
    from /Users/herk/.rbenv/versions/3.2.1/lib/ruby/gems/3.2.0/gems/railties-7.1.3/lib/rails/command/base.rb:73:in `perform'
    from /Users/herk/.rbenv/versions/3.2.1/lib/ruby/gems/3.2.0/gems/railties-7.1.3/lib/rails/command.rb:71:in `block in invoke'
    from /Users/herk/.rbenv/versions/3.2.1/lib/ruby/gems/3.2.0/gems/railties-7.1.3/lib/rails/command.rb:149:in `with_argv'
    from /Users/herk/.rbenv/versions/3.2.1/lib/ruby/gems/3.2.0/gems/railties-7.1.3/lib/rails/command.rb:69:in `invoke'
    from /Users/herk/.rbenv/versions/3.2.1/lib/ruby/gems/3.2.0/gems/railties-7.1.3/lib/rails/commands.rb:18:in `<main>'
    from <internal:/Users/herk/.rbenv/versions/3.2.1/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require'
    from <internal:/Users/herk/.rbenv/versions/3.2.1/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require'
    from /Users/herk/.rbenv/versions/3.2.1/lib/ruby/gems/3.2.0/gems/bootsnap-1.17.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
    from bin/rails:4:in `<main>'

Can anyone else replicate this? It seems like the fix would be to swap find_cmd_and_exec(...) in db_console.rb with ActiveRecord::Base.connection.class.find_cmd_and_exec.

It looks like the DBConsole method will be removed in Rails 7.2. However, in older implementations, find_cmd_and_exec in the rails repo dbconsole_command.rb causes an error. This happens because find_cmd_and_exec is being applied to the instance ActiveRecord::Base.connection rather than the class when the method is defined as a class method in AbstractAdapter.