数据库配置未指定适配器

时间:2009-01-05 16:22:57

标签: ruby-on-rails ruby

当我尝试连接到mysql数据库时,我收到此错误。问题是该应用程序可以运行数周,然后我会随机收到此消息。当我收到此错误消息时,应用程序无法重新连接到数据库,直到我重新启动它。

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

你对发生的事情有什么想法吗?

25 个答案:

答案 0 :(得分:68)

当我尝试运行命令行脚本(让我们在这里说'my_script')时,发生了同样的错误。原因是:

  1. 那里只有生产环境。
  2. 我错过了为命令行设置RAILS_ENV。
  3. 所以,以下是我案例中的解决方案:

      

    $ RAILS_ENV =生产my_script

答案 1 :(得分:35)

我刚遇到这个问题,这是由我的configration.yml中的拼写引起的。

我最初有这个:

production:
  adapter:mysql

当我打算这样做时:

production:
  adapter: mysql

适配器之间的一个小空间:和mysql有所不同。

答案 2 :(得分:11)

另一个可能的原因:

在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://...')。

因此,如果您恰好错误配置DATABASE_URL ENV['DATABASE_URL'] == '',那么database configuration does not specify adapter将为您提供。

答案 3 :(得分:7)

当我错误地使用

启动rails服务器时出现此错误
  

sudo rails s -e“Production”-p 80

我应该用

启动rails
  

sudo rails s -e“production”-p 80

答案 4 :(得分:4)

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

我最初做的事情如下,以方便本地,每个开发,Git忽略的配置文件:

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

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

无论如何,我现在不是在另一个YAML节点中混合,而是将整个developmenttest哈希放在本地配置文件中,并再次正确调用establish_connection。< / p>

答案 5 :(得分:4)

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

rake db:migrate RAILS_ENV = production

答案 6 :(得分:3)

我发现了一些可能与旧库(ActiveRecord)或gem版本相关的线索。例如,problems with fixtures even though rest of app seems okay(升级后)或this trac ticket,“阻止宝石从旧的Active Record gem中获取适配器”。但这两个都是旧的,但值得确保你的宝石是最新的(如果可能的话)。

您是否有机会使用本机rails MySQL适配器?现在这已经在rails下被弃用了,但可以想象它还在跛行。

我已经快速查看connection_specification.rb,这是错误的来源,我最好的猜测是重新连接失败了...但为什么(因为它显然没问题)当你第一次启动应用程序时)?您是否正在做一些像在应用程序控制器(或其他地方)中调用ActiveRecord::Base.establish_connection那样疯狂的事情?

或者类似的东西:当连接断开时,在夜深人静时从cron调用脚本运行器。不幸的是,使用不正确的RAILS_ENV调用了跑步者。因此,从database.yml读取错误的节,该节包含无效的adapter:

答案 7 :(得分:3)

通过输入以下命令我得到了同样的错误:

db:migrate RAILS_ENV=product

应该是:

db:migrate RAILS_ENV=production

答案 8 :(得分:2)

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

为您使用的每个rails环境提供数据库配置,如下所示,例如

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

答案 9 :(得分:2)

如果在使用Capistrano部署时出现此错误。确保通过

设置正确的RAILS_ENV
set :rails_env, 'production'

例如,我没有为Capistrano登台部署配置明确设置Rails环境。因此Capistrano使用'staging'作为RAILS_ENV,导致上述错误。在staging.rb文件中将其设置为上面的生产解决了这个问题。

答案 10 :(得分:1)

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

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

但是我的database.yml中找不到这个数据库(因为根本没有使用它)。

所以解决方案很简单:删除此文件,一切都很好!

答案 11 :(得分:1)

您可能会遇到如下错误:

RAILS_ENV= test

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

RAILS_ENV=test

答案 12 :(得分:1)

我们的旧应用程序存在此问题。有人创建了一个精品命名环境,即使RAIL_ENV已设置为生产,它也在寻找名为legacy_<RAIL_ENV>的数据库配置,因此我必须创建一个名为legacy_production的数据库环境,以使此应用程序正常工作

如果您维护其他人的应用程序,我会查找此应用程序database.yml的副本,该程序正在运行,也许它有一些奇怪的命名配置。您可以在代码库中搜索establish_connection以查看它是否定义了一些奇怪的变体。

答案 13 :(得分:1)

请记住为mysql使用基于C的ruby gem。基于红宝石的产品不稳定。

尝试安装gem

gem install mysql

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

答案 14 :(得分:1)

互联网上有很多不好的教程可以显示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文件(当然)。这里的问题清楚地说明了 - 由于适配器(又名宝石)

,Rails没有与您的数据库进行通信

答案 15 :(得分:1)

我有另一个问题的错误;我曾两次指定'开发',而根本没有'测试'。

答案 16 :(得分:0)

这发生在我身上,最后我发现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

答案 17 :(得分:0)

仅仅为了完整起见,我得到了这个错误,因为我原生创建了一个参数化的Rails转轮脚本,它接受一个电子邮件地址,并命名为命令行选项-e - 当然这是一个Rails运行器用于环境。所以它试图找到一个与电子邮件地址匹配的环境配置!

幸运的是,就在标题中提到的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

答案 18 :(得分:0)

检查adapter我有adaptor的拼写,并出现此错误。

答案 19 :(得分:0)

从Rails 4升级到5时,我收到此错误消息。

at Microsoft.Azure.Amqp.Transport.TransportStream.Flush()
   at System.IO.Stream.<>c.<FlushAsync>b__39_0(Object state)
   at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Net.Security.SslStream.<ForceAuthenticationAsync>d__171`1.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Threading.Tasks.TaskToApm.End(IAsyncResult asyncResult)
   at System.Net.Security.SslStream.EndAuthenticateAsClient(IAsyncResult asyncResult)
   at Microsoft.Azure.Amqp.Transport.TlsTransport.HandleOpenComplete(IAsyncResult result, Boolean syncComplete)
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Microsoft.Azure.Amqp.ExceptionDispatcher.Throw(Exception exception)
   at Microsoft.Azure.Amqp.AsyncResult.End[TAsyncResult](IAsyncResult result)
   at Microsoft.Azure.Amqp.AmqpObject.OpenAsyncResult.End(IAsyncResult result)
   at Microsoft.Azure.Amqp.AmqpObject.EndOpen(IAsyncResult result)
   at Microsoft.Azure.Amqp.Transport.TlsTransportInitiator.HandleTransportOpened(IAsyncResult result)
   at Microsoft.Azure.Amqp.Transport.TlsTransportInitiator.OnTransportOpened(IAsyncResult result)
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
   at Azure.Messaging.EventHubs.Amqp.AmqpConnectionScope.<CreateAndOpenConnectionAsync>d__60.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
   at Microsoft.Azure.Amqp.FaultTolerantAmqpObject`1.<OnCreateAsync>d__6.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at Microsoft.Azure.Amqp.Singleton`1.<GetOrCreateAsync>d__13.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at Microsoft.Azure.Amqp.Singleton`1.<GetOrCreateAsync>d__13.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
   at Azure.Messaging.EventHubs.Amqp.AmqpConnectionScope.<OpenProducerLinkAsync>d__58.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
   at Azure.Messaging.EventHubs.Amqp.AmqpProducer.<CreateLinkAndEnsureProducerStateAsync>d__32.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Azure.Messaging.EventHubs.Amqp.AmqpProducer.<CreateLinkAndEnsureProducerStateAsync>d__32.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
   at Microsoft.Azure.Amqp.FaultTolerantAmqpObject`1.<OnCreateAsync>d__6.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at Microsoft.Azure.Amqp.Singleton`1.<GetOrCreateAsync>d__13.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at Microsoft.Azure.Amqp.Singleton`1.<GetOrCreateAsync>d__13.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at Azure.Messaging.EventHubs.Amqp.AmqpProducer.<CreateBatchAsync>d__29.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Azure.Messaging.EventHubs.Amqp.AmqpProducer.<CreateBatchAsync>d__29.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Threading.Tasks.ValueTask`1.get_Result()
   at Azure.Messaging.EventHubs.Producer.EventHubProducerClient.<CreateBatchAsync>d__41.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Threading.Tasks.ValueTask`1.get_Result()
   at Azure.Messaging.EventHubs.Producer.EventHubProducerClient.<CreateBatchAsync>d__40.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Threading.Tasks.ValueTask`1.get_Result()
   at System.Runtime.CompilerServices.ValueTaskAwaiter`1.GetResult()
   at \EventHubSender\EventSendService.cs:line 42

其中establish_connection "myconnection" 是我的"myconnection"中的有效密钥。但是,显然不再支持将此参数作为字符串传递。改用符号可以解决问题。

答案 20 :(得分:0)

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

答案 21 :(得分:0)

对于Rails4,在fetch(:default_env).merge!(rails_env: 'production')中对production.rb行进行评论并添加set :rails_env, :production修复它。

答案 22 :(得分:0)

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

我的问题是我使用符号作为键在Hash中构建数据库设置,然后使用#to_yaml将其序列化为database.yaml。 ActiveRecord期望环境名称为Strings,而不是Symbols,因此在读取生成的文件时它没有获取数据库设置。我通过在哈希中使用字符串键来修复它。

答案 23 :(得分:0)

致电rake assets:precompile:all

答案 24 :(得分:0)

rails -e "production"没关系

rails -e production返回错误

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