数据库configuration不指定适配器

当我试图连接到一个MySQL数据库时出现这个错误。 问题是应用程序工作了几个星期,然后随机我得到这个消息。 当我得到这个错误消息时,应用程序无法重新连接到数据库,直到我重新启动它。

我正在使用configuration文件连接到数据库,并且指定了适配器…数据库configuration在运行时不会生成。

你有什么想法吗?

当我试图运行一个命令行脚本(在这里说'my_script'),同样的错误发生。 原因是:

  1. 那里只有生产环境。
  2. 我错过了为命令行设置RAILS_ENV。

所以,下面是我的情况的解决scheme:

$ RAILS_ENV =生产my_script

我刚刚有这个问题,这是由我的configration.yml中的一个错字造成的。

我原本是这样的:

 production: adapter:mysql 

当我打算这样做的时候:

 production: adapter: mysql 

适配器和mysql之间的一个小空间使得不同。

另一个可能原因:

在Rails 3.2.x中, establish_connection有一个从环境中设置的默认参数:

来自connection_specification.rb :

 def self.establish_connection(spec = ENV["DATABASE_URL"]) resolver = ConnectionSpecification::Resolver.new spec, configurations spec = resolver.spec 

ConnectionSpecification::Resolver工作方式取决于ENV['DATABASE_URL'] ,如果没有设置则给出一个nil 。 (通常,它会像'postgres://...' )。

因此,如果您碰巧错误configuration了DATABASE_URL例如ENV['DATABASE_URL'] == '' ,那么会给您的database configuration does not specify adapter

当我错误地启动rails服务器时,我有这个错误

sudo rails s -e“Production”-p 80

我应该开始与轨道

sudo rails s -e“生产”-p 80

我发现了另一个可能会导致这个问题的事情:使用&* “混合”另一个YAML节点。

我本来是在做下面这样的事情,以方便本地,per-develop,Git忽略的configuration文件:

http://blog.lathi.net/articles/2006/03/02/config-database-yml-goodness-for-teams

但是,经过一些debugging后,我发现establish_connection是由于某种原因被调用,只有混合的键值对,而不是主要的。 即adapterhostdatabase没有被传入。我不知道为什么,而这曾经为我工作。

总之,不是在另一个YAML节点中混合,而是将整个developmenttest哈希放在本地configuration文件中,并且正确地再次调用establish_connection

对我来说,这个命令解决了这个问题。

rake db:migrate RAILS_ENV = production

我发现了一些线索,这可能与较旧的库(ActiveRecord)或gem版本有关。 例如, 即使应用程序的其余部分看起来没问题 (在升级之后),或者这个trac票证 ,它会阻止gem从旧的活动logginggem中取得适配器。 尽pipe这两个都是旧的,但也许值得确保你的gem是最新的(如果可能的话)。

你有没有机会使用本地轨道的MySQL适配器? 这在铁轨下已经被弃用了,但是可以想象,它还在一路蹒跚。

我也很快地看了一下connection_specification.rb ,这个错误是从哪里来的,我最好的猜测是重新连接失败了……但是为什么(因为当你第一次启动应用程式)? 你是否像在你的应用程序控制器(或其他地方)调用ActiveRecord::Base.establish_connection一样ActiveRecord::Base.establish_connection

或者可能是这样的:当连接已经下降时,脚本运行器在夜深人静时被从cron调用。 不幸的是,跑步者被调用了不正确的RAILS_ENV 。 因此,从database.yml读取错误的节,并且该节包含无效的adapter:

我得到了同样的错误,input以下命令:

 db:migrate RAILS_ENV=product 

应该是:

 db:migrate RAILS_ENV=production 

如果在使用Capistrano进行部署时出现此错误。 确保你正在通过设置正确的RAILS_ENV

 set :rails_env, 'production' 

例如我没有明确地设置Capistrano分段部署configuration的Rails环境。 因此,Capistrano使用RAILS_ENV作为“升级”,导致上述错误。 在staging.rb文件中将其设置为像上面那样生产解决了问题。

请记住,RAILS_ENV = staging将在您的database.yml中查找一个staging规范,就像设置RAILS_ENV = production将在database.yml文件中查找生产规范一样。

例如,为您所使用的每个导轨环境提供数据库configuration,如下所示

 bundle exec cap staging deploy production: adapter: mysql2 encoding: utf8 database: rails username: rails password: pass host: 127.0.0.1 port: 3306 pool: 5 timeout: 5000 staging: adapter: mysql2 encoding: utf8 database: rails username: rails password: pass host: 127.0.0.1 port: 3306 pool: 5 timeout: 5000 

记得使用基于C的ruby gem for mysql。 基于ruby的生产是不稳定的。

尝试安装gem

 gem install mysql 

请记住将libmySQL.dll复制到ruby bin目录中。

我有另一个问题的这个错误; 我已经指定了“发展”两次,“testing”根本没有。

在互联网上有很多糟糕的教程显示yaml文件,如下所示:

 development: encoding: utf database: dbname ...etc 

YAML文件区分大小写,每个给定的db-type属性的内部内容需要两个SPACES。 像这样:

 development: encoding: utf database: dbname ...etc 

更新:今天我再次得到这个错误。 当我的应用程序运行Rails 3.2.6时,我的VPS服务器已经安装了Rails 3.2.8。

绝对检查你的Gemfile和你的database.yml文件(当然)。 这里的问题已经清楚地说明了—由于适配器(又称gem),Rails没有与您的数据库进行通信,

我们有一个旧的应用程序的问题。 有人创build了一个名为环境的专卖店,即使RAIL_ENV设置为生产,它正在寻找一个名为legacy_<RAIL_ENV>的数据库configuration,因此我必须为这个应用程序创build一个名为legacy_production的数据库环境。

如果你维护别人的应用程序,我会寻找这个应用程序的database.yml工作副本,也许它有一些奇怪的命名configuration。 你可以在你的代码库中searchestablish_connection ,看它是否定义了一些奇怪的变体。

由于“多个数据库支持问题”,我遇到了这个问题。 在我的app/model文件夹中,有一个文件定义了冗余数据库连接:

 class CacheCleanerActiveRecord < ActiveRecord::Base establish_connection "cache_cleaner_#{Rails.env}" self.abstract_class = true end 

但是这个数据库没有在我的database.yml中find(因为它没有被使用)。

所以解决scheme是简单的退出:删除这个文件,一切都很好!

你可能有这样的错误:

 RAILS_ENV= test 

等号后面的空格是不允许的,将其改为:

 RAILS_ENV=test 

rails -e "production"是好的

只有rails -e production返回错误

 database configuration does not specify adapter (ActiveRecord::AdapterNotSpecified) 

调用rake assets:precompile:all

这可能不是导致这个错误的最可能的问题,但这里只是为了以防万一。

我的问题是,我使用符号作为关键字在Hash构build数据库设置,然后使用#to_yaml将其序列化为database.yaml 。 ActiveRecord希望环境名称是Strings ,而不是Symbols ,所以在读取生成的文件时,不会Symbols数据库设置。 我通过在散列中使用string键来修复它。

对于Rails4,在production.rb中注释line fetch(:default_env).merge!(rails_env: 'production')并添加set :rails_env, :production修复它。

你需要在运行服务器或命令时指定环境作为你的database.yml文件可能只有生产适配器,而只需runnig rake db:例如migrate将环境variables作为开发。

这发生在我身上,最后我发现RAILS_ENV是区分大小写的,在我的环境中我设置了RAILS_ENV=DEVELOPMENT ,这是错误的, RAILS_ENV的值必须是小写

 $ RAILS_ENV=DEVELOPMENT rails server webrick => Booting WEBrick => Rails 4.2.5 application starting in DEVELOPMENT on http://localhost:3000 => Run `rails server -h` for more startup options => Ctrl-C to shutdown server config.eager_load is set to nil. Please update your config/environments/*.rb files accordingly: * development - set it to false * test - set it to false (unless you use a tool that preloads your test environment) * production - set it to true Exiting /home/fangxing/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/connection_specification.rb:248:in `resolve_symbol_c onnection': 'DEVELOPMENT' database is not configured. Available: ["default", "development", "test", "production"] (ActiveRecord::AdapterNotSpecified) from /home/fangxing/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/connection_specification.rb:211:in `res olve_connection' $ RAILS_ENV=development rails server webrick RubyDep: WARNING: Your Ruby is outdated/buggy. (To disable warnings, set RUBY_DEP_GEM_SILENCE_WARNINGS=1) RubyDep: WARNING: Your Ruby is: 2.3.0 (buggy). Recommendation: install 2.3.1. => Booting WEBrick => Rails 4.2.5 application starting in development on http://localhost:3000 => Run `rails server -h` for more startup options => Ctrl-C to shutdown server [2016-07-20 16:41:09] INFO WEBrick 1.3.1 [2016-07-20 16:41:09] INFO ruby 2.3.0 (2015-12-25) [x86_64-linux] [2016-07-20 16:41:09] INFO WEBrick::HTTPServer#start: pid=19881 port=3000 

只是为了完整性,我刚刚得到这个错误,因为我本身创build了一个参数化的Rails runner脚本,它需要一个电子邮件地址,并命名为命令行选项-e – 这当然是Rails runner用于环境的那个。 所以它试图find一个匹配电子邮件地址的环境configuration!

幸运的是,在标题中提到的ActiveRecord错误之前,它给了我一个错误消息,帮助我分解了实际的问题:

 You did not specify how you would like Rails to report deprecation notices for your test@example.com environment, please set config.active_support.deprecation to :log, :notify or :stderr at config/environments/test@example.com.rb