Skip to content
Browse files

Fix rails db command with sqlite3 database

When using sqlite3 it was attempting to find the database file based on
Rails.root, the problem is that Rails.root is not always present because
we try to first manually load "config/database.yml" instead of loading
the entire app, to make "rails db" faster.

This means that when we're in the root path of the app, calling "rails db"
won't allow us to use Rails.root, making the command fail for sqlite3
with the error:

    ./rails/commands/dbconsole.rb:62:in `start':
      undefined method `root' for Rails:Module (NoMethodError)

The fix is to simply not pass any dir string to File.expand_path, which
will make it use the current directory of the process as base, or the
root path of the app, which is what we want.

When we are in any other subdirectory, calling "rails db" should work
just fine, because "config/database.yml" won't be found, thus "rails db"
will fallback to loading the app, making Rails.root available.

Closes #8257.
  • Loading branch information...
1 parent 0cc9c12 commit 53aefdec91e4e26b2fbd1a8dc39817ecabfe6125 @carlosantoniodasilva carlosantoniodasilva committed Nov 18, 2012
Showing with 13 additions and 5 deletions.
  1. +5 −5 railties/lib/rails/commands/dbconsole.rb
  2. +8 −0 railties/test/commands/dbconsole_test.rb
10 railties/lib/rails/commands/dbconsole.rb
@@ -6,7 +6,7 @@
module Rails
class DBConsole
attr_reader :config, :arguments
def self.start
@@ -59,7 +59,7 @@ def start
args << "-#{options['mode']}" if options['mode']
args << "-header" if options['header']
- args << File.expand_path(config['database'], Rails.root)
+ args << File.expand_path(config['database'], Rails.respond_to?(:root) ? Rails.root : nil)
find_cmd_and_exec('sqlite3', *args)
@@ -108,7 +108,7 @@ def environment
def parse_arguments(arguments)
options = {}
+ do |opt|
opt.banner = "Usage: rails dbconsole [environment] [options]"
opt.on("-p", "--include-password", "Automatically provide the password from database.yml") do |v|
@@ -123,7 +123,7 @@ def parse_arguments(arguments)
opt.on("--header") do |h|
options['header'] = h
opt.on("-h", "--help", "Show this help message.") do
puts opt
@@ -142,7 +142,7 @@ def parse_arguments(arguments)
env = arguments.first
options[:environment] = %w(production development test).detect {|e| e =~ /^#{env}/} || env
8 railties/test/commands/dbconsole_test.rb
@@ -116,6 +116,14 @@ def test_sqlite3_db_absolute_path
assert !aborted
+ def test_sqlite3_db_without_defined_rails_root
+ Rails.stubs(:respond_to?)
+ Rails.expects(:respond_to?).with(:root).once.returns(false)
+ dbconsole.expects(:find_cmd_and_exec).with('sqlite3', Rails.root.join('../config/db.sqlite3').to_s)
+ start(adapter: 'sqlite3', database: 'config/db.sqlite3')
+ assert !aborted
+ end
def test_oracle
dbconsole.expects(:find_cmd_and_exec).with('sqlplus', 'user@db')
start(adapter: 'oracle', database: 'db', username: 'user', password: 'secret')

0 comments on commit 53aefde

Please sign in to comment.
Something went wrong with that request. Please try again.