当我尝试连接到mysql数据库时,我收到此错误。问题是该应用程序可以运行数周,然后我会随机收到此消息。当我收到此错误消息时,应用程序无法重新连接到数据库,直到我重新启动它。
我正在使用配置文件连接到数据库,并指定了适配器......数据库配置不会在运行时生成。
你对发生的事情有什么想法吗?
答案 0 :(得分:68)
当我尝试运行命令行脚本(让我们在这里说'my_script')时,发生了同样的错误。原因是:
所以,以下是我案例中的解决方案:
$ 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
我应该用
启动railssudo 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
由于某种原因被调用只有混合键值对而不是主键值。即adapter
,host
和database
没有被传入。我不知道为什么,这曾经对我有效。
无论如何,我现在不是在另一个YAML节点中混合,而是将整个development
和test
哈希放在本地配置文件中,并再次正确调用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_ENVset :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)