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
View
10 railties/lib/rails/commands/dbconsole.rb
@@ -6,7 +6,7 @@
module Rails
class DBConsole
attr_reader :config, :arguments
-
+
def self.start
new.start
end
@@ -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 = {}
-
+
OptionParser.new 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
end
-
+
opt.on("-h", "--help", "Show this help message.") do
puts opt
exit
@@ -142,7 +142,7 @@ def parse_arguments(arguments)
env = arguments.first
options[:environment] = %w(production development test).detect {|e| e =~ /^#{env}/} || env
end
-
+
options
end
View
8 railties/test/commands/dbconsole_test.rb
@@ -116,6 +116,14 @@ def test_sqlite3_db_absolute_path
assert !aborted
end
+ 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.