Rails数据库配置未指定适配器。我该怎么办?

时间:2013-07-10 19:10:04

标签: ruby-on-rails ruby database

以下是错误消息:

/Users/davidzabner/.rvm/gems/ruby-1.9.3-p448/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/connection_specification.rb:47:in `resolve_hash_connection'
    /Users/davidzabner/.rvm/gems/ruby-1.9.3-p448/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/connection_specification.rb:41:in `resolve_string_connection'
    ...
    /Users/davidzabner/.rvm/gems/ruby-1.9.3-p448/gems/railties-3.2.13/lib/rails/application.rb:103:in `require_environment!'
    /Users/davidzabner/.rvm/gems/ruby-1.9.3-p448/gems/railties-3.2.13/lib/rails/application.rb:297:in `block (2 levels) in initialize_tasks'
    /Users/davidzabner/.rvm/gems/ruby-1.9.3-p448/bin/ruby_noexec_wrapper:14:in `eval'
    /Users/davidzabner/.rvm/gems/ruby-1.9.3-p448/bin/ruby_noexec_wrapper:14:in `<main>'

我的database.yml文件:

development:
  adapter: sqlite3
  database: db/development.sqlite3
  pool: 5
  timeout: 5000

test:
  adapter: sqlite3
  database: db/test.sqlite3
  pool: 5
  timeout: 5000

production:
  adapter: sqlite3
  database: db/production.sqlite3
  pool: 5
  timeout: 5000

我的Gemfile:

source 'https://rubygems.org'

gem "therubyracer"
gem "less-rails" #Sprockets (what Rails 3.1 uses for its asset pipeline) supports LESS
gem "twitter-bootstrap-rails"
gem 'jquery-rails'
gem 'devise'

gem 'rails', '3.2.13'

# Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git'

group :development, :test do
    gem 'sqlite3'
end

group :production do
    gem 'pg'
end

gem 'mini_magick'
gem "rmagick"
gem "carrierwave"


# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails',   '~> 3.2.3'
  gem 'coffee-rails', '~> 3.2.1'

  # See https://github.com/sstephenson/execjs#readme for more supported runtimes
  # gem 'therubyracer', :platforms => :ruby

  gem 'uglifier', '>= 1.0.3'
end

gem 'jquery-rails'

# To use ActiveModel has_secure_password
# gem 'bcrypt-ruby', '~> 3.0.0'

# To use Jbuilder templates for JSON
# gem 'jbuilder'

# Use unicorn as the app server
# gem 'unicorn'

# Deploy with Capistrano
# gem 'capistrano'

# To use debugger
# gem 'debugger'

6 个答案:

答案 0 :(得分:8)

我在一个复杂的项目中解决了类似的问题。不确定它是直接相关的,但我发布这个,因为调试问题的方式可能会有所帮助。

就我而言,我有以下情况:

  • 情况仅发生在RAILS_ENV=production。当我做RAILS_ENV=development它有效。奇怪的是,当我将production中的database.yml条目更改为production2并使用RAILS_ENV=production2运行命令时,它就有用了。
  • 在项目中,我通过各种模型和库连接到多个数据库连接。

以下是我为检测问题所做的工作:

vim /Users/davidzabner/.rvm/gems/ruby-1.9.3-p448/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/connection_specification.rb

(或者回溯告诉你问题的地方)。

然后,我在代码中找到了包含这些行的位置:

def resolve_hash_connection(spec) # :nodoc:
  spec = spec.symbolize_keys

  raise(AdapterNotSpecified, "database configuration does not specify adapter") unless spec.key?(:adapter)

并将其更改为以下内容:

def resolve_hash_connection(spec) # :nodoc:
  spec = spec.symbolize_keys

  # Debug printing
  puts "*" * 80, spec.inspect, "*" * 80

  raise(AdapterNotSpecified, "database configuration does not specify adapter") unless spec.key?(:adapter)

然后我重新命令,在我的情况下bundle exec rails c production

通过这样做,我意识到Rails并没有像我想象的那样寻找production条目。它正在寻找一个名为abc_production的不同条目,由于我之前提到的多个数据库连接,这在我的项目中是必需的。在该特定服务器上,有人忘记将abc_production条目添加到database.yml。添加条目解决了这个问题。

我认为它只发生在RAILS_ENV=production时,因为在environments/production.rb我有config.eager_load = true,这意味着Rails会急切地将应用程序和类加载到内存中,并可能尝试建立所有数据库在这些类中定义的连接(其中一个是abc_production)。

希望这可以帮助处于类似情况的人...如果您没有使用多个连接,请尝试通过更改connection_specification.rb来调试问题并查看它是否为您提供任何潜在客户..

答案 1 :(得分:6)

我现在不是你想要做的事情,但是。

目前我遇到了与我试图运行相同的错误&lt; rails c -e production&gt;用ruby-2.10。

  

`resolve_hash_connection':数据库配置未指定适配器(ActiveRecord :: AdapterNotSpecified)

因为我跑&lt; rails c production&gt;一切正常。

也许这有助于某人

答案 2 :(得分:1)

我在登台环境中遇到了类似问题,我做了:

  1. 为devise.rb初始化文件添加了设计秘密
  2. 在secrets.yml
  3. 中配置了分段'secret_key_base'

    之后它在那里工作得很好。

答案 3 :(得分:0)

我已经给出了一个带有示例数据库配置的要点,请确保您使用它。 要点位于:https://gist.github.com/fidalgo/5970617

还要确保运行rake db:setup来设置数据库。

此外,在您的环境中,您也使用Sqlite进行生产和测试,在Gemfile中更改以下行:

group :development, :test do
    gem 'sqlite3'
end

#group :development, :test do
    gem 'sqlite3'
#end

除了使用除开发之外的其他环境之外,它不应该有任何显着差异。

答案 4 :(得分:0)

我也遇到了这个问题。我尝试了所有我能找到的类似问题,但没有一个解决了我的问题,然后我尝试打印配置系统从activerecord-3.2.13/lib/active_record/connection_adapters/abstract/connection_specification.rb

中的database.yml读取
def resolve_string_connection(spec) # :nodoc:
  hash = configurations.fetch(spec) do |k|
    connection_url_to_hash(k)
  end
  p configurations
  p spec
  raise(AdapterNotSpecified, "#{spec} database is not configured") unless hash

  resolve_hash_connection hash
end

输出

{"production"=>nil, "  adapter"=>"mysql2", "  encoding"=>"utf8mb4", "  username"=>"myUsername", "  password"=>"myPassword", "  pool"=>5, "  database"=>"mydb", "  host"=>"myHost", "  port"=>3306, "mydb_production"=>nil}

所以我的问题是在database.yml中出现了错误导致YAML解析错误。但是我的裸眼没有发现任何问题所以我从另一台服务器复制了一个文件然后解决了问题。

希望这可以帮助某人:p

答案 5 :(得分:0)

意识到这有点老了,但刚刚在寻找类似问题的答案时遇到过。只是想指出你的.yml中仍然有sqlite3作为你的适配器。正如您可能已经发现的那样,Heroku不允许sqlite3作为生产数据库。 SQLite on Heroku