ruby-on-rails - Rails 数据库配置没有指定适配器。我该怎么办?

标签 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

我的 gem 文件:

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'

最佳答案

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

在我的例子中,我遇到了以下情况:

  • 这种情况只发生在 RAILS_ENV=production 时。当我执行 RAILS_ENV=development 时,它起作用了。奇怪的是,当我将 database.yml 中的 production 条目更改为 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 来调试问题,看看它是否给您任何线索。

关于ruby-on-rails - Rails 数据库配置没有指定适配器。我该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17579012/

相关文章:

ruby-on-rails - Rails 5 事件管理员安装问题

ruby-on-rails - 如何在Rails 3应用程序中列出所有定义的环境?

javascript - Rails 5 - turbolinks 5,一些 JS 未在页面呈现时加载

database - 当数据库引擎用完用于主键的数字时会发生什么?

javascript - rails 3 : How to display a warning message when a link is clicked?

ruby-on-rails - "heroku logs"给我 "Not found"

mysql - 每当我运行 rake db :migrate 时,Rails Schema 都会无意中更改

ruby - Chef-solo 无法找到 Chef::Resource::PythonPip

c# - Entity Framework 6.0 代码优先迁移 - 模型/数据库兼容性错误?

database - 任何用于存储过程的静态代码分析工具?