数据库configuration不指定适配器
当我试图连接到一个MySQL数据库时出现这个错误。 问题是应用程序工作了几个星期,然后随机我得到这个消息。 当我得到这个错误消息时,应用程序无法重新连接到数据库,直到我重新启动它。
我正在使用configuration文件连接到数据库,并且指定了适配器…数据库configuration在运行时不会生成。
你有什么想法吗?
当我试图运行一个命令行脚本(在这里说'my_script'),同样的错误发生。 原因是:
- 那里只有生产环境。
- 我错过了为命令行设置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
是由于某种原因被调用,只有混合的键值对,而不是主要的。 即adapter
, host
和database
没有被传入。我不知道为什么,而这曾经为我工作。
总之,不是在另一个YAML节点中混合,而是将整个development
和test
哈希放在本地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