【问题标题】:database configuration does not specify adapter数据库配置未指定适配器
【发布时间】:2009-01-05 16:22:56
【问题描述】:

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

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

你知道发生了什么吗?

【问题讨论】:

  • 什么平台?您可以发布完整的堆栈跟踪/日志条目吗?当您“重新启动它”时,您是指应用程序还是数据库?
  • 感谢大家在这里提出的建议。我目前在使用 Rails 3.2.6 的 Heroku 上遇到这个问题。当RACK_ENV=developmentRAILS_ENV=production 一切正常,但当RACK_ENV=productionRAILS_ENV 未设置时,我更喜欢这样,然后我会收到此消息。这里的讨论帮助我找到了这种独特的情况组合。当我知道更多时会报告。
  • 实际上,stackoverflow.com/questions/9661115/… 更准确地跟踪了我的问题。稍后会在那里发布我的发现。
  • 我已将 cmets ("#") 插入到 database.yml 文件中。这显然是个坏主意。
  • 检查您的 database.yml 文件。确保“适配器”处于默认状态或在环境中指定默认值:&default 池:5 超时:5000 开发:

标签: ruby-on-rails ruby


【解决方案1】:

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

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

所以,以下是我的解决方案:

$ RAILS_ENV=production my_script

【讨论】:

  • $ export RAILS_ENV=production 应该会更好。
  • 另外,如果您只需要 rakecommand 或类似的命令,您可以直接将其作为参数传递,例如:rake redmine:plugins:migrate RAILS_ENV=production
  • 对于捆绑器:RAILS_ENV=production bundle exec ... - 在我的情况下为 RAILS_ENV=production bundle exec rake assets:precompile
  • 在我运行 RAILS_ENV=production rails c 时为我工作,但在我运行 rails c RAILS_ENV=production 时没有工作。首先设置环境是诀窍。
【解决方案2】:

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

我原来有这个:

production:
  adapter:mysql

当我想要这个时:

production:
  adapter: mysql

adapter: 和 mysql 之间的那一点点空间就不同了。

【讨论】:

  • 这正是我的问题。那太棒了。由于没有制表符,我认为缺少空格应该不是问题。感谢您的提示。
【解决方案3】:

另一个可能的原因:

在 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

【讨论】:

  • 希望我在一周前就看到了。谢谢!
  • 我正在使用docker-compose ,所以我这样做了DATABASE_URL: database_service/app_development,其中databases_service 是另一个容器名称,app_development 是数据库。我期待 docker 将容器链接在一起,但由于某种原因,我只在此设置中收到此错误 PS:我之前做过这个并且它有效,所以这就是我感到困惑的原因
  • 是的,我的问题是我需要将完整的 URL 放入 DATABASE_URL
【解决方案4】:

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

sudo rails s -e "生产" -p 80

我应该用

sudo rails s -e "生产" -p 80

【讨论】:

    【解决方案5】:

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

    我最初是在做类似以下的事情来促进本地、每个开发、Git 忽略的配置文件:

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

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

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

    【讨论】:

      【解决方案6】:

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

      rake db:migrate RAILS_ENV=production

      【讨论】:

        【解决方案7】:

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

        您是否正在使用本机 Rails MySQL 适配器?这现在在 rails 下已被弃用,但可以想象它仍在蹒跚前行。

        我也快速查看了connection_specification.rb,这也是此错误的来源,我最好的猜测是重新连接失败......但是为什么(因为当你首次启动应用程序)?您是否正在做一些疯狂的事情,例如在您的应用程序控制器(或其他地方)中调用ActiveRecord::Base.establish_connection

        或者可能是这样的:当连接断开时,在深夜从 cron 调用脚本运行程序。不幸的是,运行器被错误的RAILS_ENV 调用。因此从database.yml 读取了错误的节,并且该节包含无效的adapter:

        【讨论】:

        • 为我解决了。错误的环境,指向我的 database.yml 文件中不存在的节。 xD
        【解决方案8】:

        我遇到了同样的错误,输入以下命令:

        db:migrate RAILS_ENV=product
        

        应该是:

        db:migrate RAILS_ENV=production
        

        【讨论】:

          【解决方案9】:

          如果您在使用 Capistrano 进行部署时遇到此错误。确保您通过

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

          例如,我没有为 Capistrano 分段部署配置显式设置 Rails 环境。因此 Capistrano 使用 'staging' 作为 RAILS_ENV,导致上述错误。在 staging.rb 文件中将其设置为如上所述的生产解决了该问题。

          【讨论】:

            【解决方案10】:

            请记住,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
            

            【讨论】:

              【解决方案11】:

              记得为 mysql 使用基于 C 的 ruby​​ gem。基于 ruby​​ 的生产环境不稳定。

              尝试安装 gem

              gem install mysql
              

              记得将 libmySQL.dll 复制到 ruby​​ bin 目录中。

              【讨论】:

              • 嗯,我的网络服务器是 ubuntu 的。尝试安装 mysql gem 我得到这个列表: 1. mysql 2.7.3 (mswin32) 2. mysql 2.7.1 (mswin32) 3. mysql 2.7 (ruby) 4. mysql 2.6 (ruby) 我应该选择哪一个?
              【解决方案12】:

              我在另一个问题上遇到了这个错误;我已经指定了两次“开发”,而根本没有指定“测试”。

              【讨论】:

                【解决方案13】:

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

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

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

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

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

                一定要检查你的 Gemfile 和你的 database.yml 文件(当然)。这里的问题很清楚---Rails 没有与您的数据库进行通信,具体是由于适配器(又名 gem)

                【讨论】:

                • 我发现文件底部的环境条目格式正确,但前一个条目中的多余空格是问题所在。开发运行良好,因为它在格式不正确的条目之前,所以如果您确定您的条目正确,请检查其他条目。
                【解决方案14】:

                我们的一个旧应用程序出现了这个问题。有人创建了一个精品命名环境,即使将 RAIL_ENV 设置为生产环境,它也在寻找一个名为 legacy_<RAIL_ENV> 的数据库配置,所以我必须创建一个名为 legacy_production 的数据库环境才能让这个应用程序运行。

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

                【讨论】:

                  【解决方案15】:

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

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

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

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

                  【讨论】:

                  【解决方案16】:

                  您可能会遇到如下错误:

                  RAILS_ENV= test
                  

                  等号后面不允许有空格,改为:

                  RAILS_ENV=test
                  

                  【讨论】:

                    【解决方案17】:

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

                    【讨论】:

                    • 请不要将文本作为图片发布(无法搜索),而是将文本复制粘贴到您的帖子中。谢谢。
                    • 知道了,谢谢你的建议
                    【解决方案18】:

                    rails -e "production" 没问题

                    只有rails -e production 返回错误

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

                    【讨论】:

                      【解决方案19】:

                      致电rake assets:precompile:all

                      【讨论】:

                        【解决方案20】:

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

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

                        【讨论】:

                          【解决方案21】:

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

                          【讨论】:

                            【解决方案22】:

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

                            【讨论】:

                              【解决方案23】:

                              为了完整起见,我刚刚收到此错误,因为我本机创建了一个带有电子邮件地址的参数化 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
                              

                              【讨论】:

                                【解决方案24】:

                                检查adapter 的拼写我有adaptor 并得到了这个错误。

                                【讨论】:

                                  【解决方案25】:

                                  从 Rails 4 升级到 5 时出现此错误消息。我正在调用

                                  establish_connection "myconnection"
                                  

                                  其中"myconnection" 是我的database.yml 中的有效密钥。但是,显然不再支持将此参数作为字符串传递。使用符号代替了这个问题。

                                  【讨论】:

                                  猜你喜欢
                                  • 2014-06-13
                                  • 1970-01-01
                                  • 2015-11-26
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2023-03-27
                                  • 1970-01-01
                                  相关资源
                                  最近更新 更多