2015-04-07 64 views
2

我的數據庫是運行在localhost上的MySQL。安裝了沒有錯誤的gem mysql2。無論我使用哪個登錄名,我都無法連接。`AdapterNotSpecified`數據庫未配置

根密碼包含一個#它是Sublime Text 2編輯器中的註釋字符,所以我認爲它可能不會正確傳遞我的密碼。

我試過使用雙引號和單引號,但它似乎沒有任何區別。我也嘗試創建一個新用戶並在命令行上給予該用戶權限。

我已經閱讀了很多相似的帖子,但還沒有找到解決方案。

下面是錯誤的堆棧跟蹤:

C:\inetpub\wwwroot\siteone\simple_cms>rake db:schema:dump --trace 
DL is deprecated, please use Fiddle 
** Invoke db:schema:dump (first_time) 
** Invoke environment (first_time) 
** Execute environment 
** Invoke db:load_config (first_time) 
** Execute db:load_config 
rake aborted! 
ActiveRecord::AdapterNotSpecified: 'mysql2' database is not configured. Available: ["default", "adapter", "encoding", "pool", "username", "password", "host", "development", "database", "socket"] 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.1/lib/active_record/connection_adapters/connection_specification.rb:248:in `resolve_symbol 
_connection' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.1/lib/active_record/connection_adapters/connection_specification.rb:231:in `resolve_string_connection' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.1/lib/active_record/connection_adapters/connection_specification.rb:213:in `resolve_connection' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-.2.1/lib/active_record/connection_adapters/connection_specification.rb:139:in `resolve'C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.1/lib/active_record/connection_adapters/connection_specification.rb:151:in `block in resolve_all' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.1/lib/active_record/connection_adapters/connection_specification.rb:150:in `each'C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.1/lib/active_record/connection_adapters/connection_specification.rb:150:in `resolve_all' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.1/lib/active_record/connection_handling.rb:69:in `resolve' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.1/lib/active_record/core.rb:46:in `configurations=' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.1/lib/active_record/railtie.rb:117:in `block (2 levels) in <class:Railtie>' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activesupport-4.2.1/lib/active_support/lazy_load_hooks.rb:38:in `instance_eval' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activesupport-4.2.1/lib/active_support/lazy_load_hooks.rb:38:in `execute_hook' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activesupport-4.2.1/lib/active_support/lazy_load_hooks.rb:45:in `block in run_load_hooks' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activesupport-4.2.1/lib/active_support/lazy_load_hooks.rb:44:in `each' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activesupport-4.2.1/lib/active_support/lazy_load_hooks.rb:44:in `run_load_hooks' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.1/lib/active_record/base.rb:316:in `<module:ActiveRecord>' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.1/lib/active_record/base.rb:26:in `<top (required)>' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.1/lib/active_record/tasks/mysql_database_tasks.rb:8:in `<class:MySQLDatabaseTasks>' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.1/lib/active_record/tasks/mysql_database_tasks.rb:3:in `<module:Tasks>' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.1/lib/active_record/tasks/mysql_database_tasks.rb:2:in `<module:ActiveRecord>' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.1/lib/active_record/tasks/mysql_database_tasks.rb:1:in `<top (required)>' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.1/lib/active_record/tasks/database_tasks.rb:50:in `<module:DatabaseTasks>' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.1/lib/active_record/tasks/database_tasks.rb:37:in `<module:Tasks>' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.1/lib/active_record/tasks/database_tasks.rb:4:in `<module:ActiveRecord>' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.1/lib/active_record/tasks/database_tasks.rb:3:in `<top (required)>' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.1/lib/active_record/railtie.rb:41:in `block (3 levels) in <class:Railtie>' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/rake-0.4.2/lib/rake/task.rb:240:in `call' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/task.rb:240:in `block in execute' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/rake-0.4.2/lib/rake/task.rb:235:in `each' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/task.rb:235:in `execute' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/task.rb:179:in `block in invoke_with_call_chain' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/2.0.0/monitor.rb:211:in `mon_synchronize'C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/task.rb:172:in `invoke_with_call_chain' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/rake-0.4.2/lib/rake/task.rb:201:in `block in invoke_prerequisites' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/task.rb:199:in `each' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/task.rb:199:in `invoke_prerequisites' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/task.rb:178:in `block in invoke_with_call_chain' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/2.0.0/monitor.rb:211:in `mon_synchronize'C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/task.rb:172:in `invoke_with_call_chain' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/task.rb:165:in `invoke' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/application.rb:150:in `invoke_task' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/application.rb:106:in `block (2 levels) in top_level' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/application.rb:106:in `each' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/application.rb:106:in `block in top_level' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/application.rb:115:in `run_with_threads' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/application.rb:100:in `top_level' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/application.rb:78:in `block in run' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/application.rb:176:in `standard_exception_handling' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/application.rb:75:in `run' 
C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/rake-10.4.2/bin/rake:33:in`<top (required)>' 
C:/RailsInstaller/Ruby2.0.0/bin/rake:23:in `load' 
C:/RailsInstaller/Ruby2.0.0/bin/rake:23:in `<main>' 
Tasks: TOP => db:schema:dump => db:load_config 

C:\inetpub\wwwroot\siteone\simple_cms> 

我編輯database.yml現在的錯誤略有改變。

​​

最後,我connection_specification.rb文件,其中我認爲問題所在。

require 'uri' 
require 'active_support/core_ext/string/filters' 

module ActiveRecord 
    module ConnectionAdapters 
    class ConnectionSpecification #:nodoc: 
     attr_reader :config, :adapter_method 

     def initialize(config, adapter_method) 
     @config, @adapter_method = config, adapter_method 
     end 

     def initialize_dup(original) 
     @config = original.config.dup 
     end 

     # Expands a connection string into a hash. 
     class ConnectionUrlResolver # :nodoc: 

     # == Example 
     # 
     # url = "postgresql://foo:[email protected]:9000/foo_test?pool=5&timeout=3000" 
     # ConnectionUrlResolver.new(url).to_hash 
     # # => { 
     #  "adapter" => "postgresql", 
     #  "host"  => "localhost", 
     #  "port"  => 9000, 
     #  "database" => "foo_test", 
     #  "username" => "foo", 
     #  "password" => "bar", 
     #  "pool"  => "5", 
     #  "timeout" => "3000" 
     # } 
     def initialize(url) 
      raise "Database URL cannot be empty" if url.blank? 
      @uri  = uri_parser.parse(url) 
      @adapter = @uri.scheme.tr('-', '_') 
      @adapter = "postgresql" if @adapter == "postgres" 

      if @uri.opaque 
      @uri.opaque, @query = @uri.opaque.split('?', 2) 
      else 
      @query = @uri.query 
      end 
     end 

     # Converts the given URL to a full connection hash. 
     def to_hash 
      config = raw_config.reject { |_,value| value.blank? } 
      config.map { |key,value| config[key] = uri_parser.unescape(value) if value.is_a? String } 
      config 
     end 

     private 

     def uri 
      @uri 
     end 

     def uri_parser 
      @uri_parser ||= URI::Parser.new 
     end 

     # Converts the query parameters of the URI into a hash. 
     # 
     # "localhost?pool=5&reaping_frequency=2" 
     # # => { "pool" => "5", "reaping_frequency" => "2" } 
     # 
     # returns empty hash if no query present. 
     # 
     # "localhost" 
     # # => {} 
     def query_hash 
      Hash[(@query || '').split("&").map { |pair| pair.split("=") }] 
     end 

     def raw_config 
      if uri.opaque 
      query_hash.merge({ 
       "adapter" => @adapter, 
       "database" => uri.opaque }) 
      else 
      query_hash.merge({ 
       "adapter" => @adapter, 
       "username" => uri.user, 
       "password" => uri.password, 
       "port"  => uri.port, 
       "database" => database_from_path, 
       "host"  => uri.hostname }) 
      end 
     end 

     # Returns name of the database. 
     def database_from_path 
      if @adapter == 'sqlite3' 
      # 'sqlite3:/foo' is absolute, because that makes sense. The 
      # corresponding relative version, 'sqlite3:foo', is handled 
      # elsewhere, as an "opaque". 

      uri.path 
      else 
      # Only SQLite uses a filename as the "database" name; for 
      # anything else, a leading slash would be silly. 

      uri.path.sub(%r{^/}, "") 
      end 
     end 
     end 

     ## 
     # Builds a ConnectionSpecification from user input. 
     class Resolver # :nodoc: 
     attr_reader :configurations 

     # Accepts a hash two layers deep, keys on the first layer represent 
     # environments such as "production". Keys must be strings. 
     def initialize(configurations) 
      @configurations = configurations 
     end 

     # Returns a hash with database connection information. 
     # 
     # == Examples 
     # 
     # Full hash Configuration. 
     # 
     # configurations = { "production" => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3" } } 
     # Resolver.new(configurations).resolve(:production) 
     # # => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3"} 
     # 
     # Initialized with URL configuration strings. 
     # 
     # configurations = { "production" => "postgresql://localhost/foo" } 
     # Resolver.new(configurations).resolve(:production) 
     # # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" } 
     # 
     def resolve(config) 
      if config 
      resolve_connection config 
      elsif env = ActiveRecord::ConnectionHandling::RAILS_ENV.call 
      resolve_symbol_connection env.to_sym 
      else 
      raise AdapterNotSpecified 
      end 
     end 

     # Expands each key in @configurations hash into fully resolved hash 
     def resolve_all 
      config = configurations.dup 
      config.each do |key, value| 
      config[key] = resolve(value) if value 
      end 
      config 
     end 

     # Returns an instance of ConnectionSpecification for a given adapter. 
     # Accepts a hash one layer deep that contains all connection information. 
     # 
     # == Example 
     # 
     # config = { "production" => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3" } } 
     # spec = Resolver.new(config).spec(:production) 
     # spec.adapter_method 
     # # => "sqlite3_connection" 
     # spec.config 
     # # => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3" } 
     # 
     def spec(config) 
      spec = resolve(config).symbolize_keys 

      raise(AdapterNotSpecified, "database configuration does not specify adapter") unless spec.key?(:adapter) 

      path_to_adapter = "active_record/connection_adapters/#{spec[:adapter]}_adapter" 
      begin 
      require path_to_adapter 
      rescue Gem::LoadError => e 
      raise Gem::LoadError, "Specified '#{spec[:adapter]}' for database adapter, but the gem is not loaded. Add `gem '#{e.name}'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord)." 
      rescue LoadError => e 
      raise LoadError, "Could not load '#{path_to_adapter}'. Make sure that the adapter in config/database.yml is valid. If you use an adapter other than 'mysql', 'mysql2', 'postgresql' or 'sqlite3' add the necessary adapter gem to the Gemfile.", e.backtrace 
      end 

      adapter_method = "#{spec[:adapter]}_connection" 
      ConnectionSpecification.new(spec, adapter_method) 
     end 

     private 

     # Returns fully resolved connection, accepts hash, string or symbol. 
     # Always returns a hash. 
     # 
     # == Examples 
     # 
     # Symbol representing current environment. 
     # 
     # Resolver.new("production" => {}).resolve_connection(:production) 
     # # => {} 
     # 
     # One layer deep hash of connection values. 
     # 
     # Resolver.new({}).resolve_connection("adapter" => "sqlite3") 
     # # => { "adapter" => "sqlite3" } 
     # 
     # Connection URL. 
     # 
     # Resolver.new({}).resolve_connection("postgresql://localhost/foo") 
     # # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" } 
     # 
     def resolve_connection(spec) 
      case spec 
      when Symbol 
      resolve_symbol_connection spec 
      when String 
      resolve_string_connection spec 
      when Hash 
      resolve_hash_connection spec 
      end 
     end 

     def resolve_string_connection(spec) 
      # Rails has historically accepted a string to mean either 
      # an environment key or a URL spec, so we have deprecated 
      # this ambiguous behaviour and in the future this function 
      # can be removed in favor of resolve_url_connection. 
      if configurations.key?(spec) || spec !~ /:/ 
      ActiveSupport::Deprecation.warn(<<-MSG.squish) 
       Passing a string to ActiveRecord::Base.establish_connection for a 
       configuration lookup is deprecated, please pass a symbol 
       (#{spec.to_sym.inspect}) instead. 
      MSG 

      resolve_symbol_connection(spec) 
      else 
      resolve_url_connection(spec) 
      end 
     end 

     # Takes the environment such as +:production+ or +:development+. 
     # This requires that the @configurations was initialized with a key that 
     # matches. 
     # 
     # Resolver.new("production" => {}).resolve_symbol_connection(:production) 
     # # => {} 
     # 
     def resolve_symbol_connection(spec) 
      if config = configurations[spec.to_s] 
      resolve_connection(config) 
      else 
      raise(AdapterNotSpecified, "'#{spec}' database is not configured. Available: #{configurations.keys.inspect}") 
      end 
     end 

     # Accepts a hash. Expands the "url" key that contains a 
     # URL database connection to a full connection 
     # hash and merges with the rest of the hash. 
     # Connection details inside of the "url" key win any merge conflicts 
     def resolve_hash_connection(spec) 
      if spec["url"] && spec["url"] !~ /^jdbc:/ 
      connection_hash = resolve_url_connection(spec.delete("url")) 
      spec.merge!(connection_hash) 
      end 
      spec 
     end 

     # Takes a connection URL. 
     # 
     # Resolver.new({}).resolve_url_connection("postgresql://localhost/foo") 
     # # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" } 
     # 
     def resolve_url_connection(url) 
      ConnectionUrlResolver.new(url).to_hash 
     end 
     end 
    end 
    end 
end 
+0

可能與第12行database.yml問題 - 我建議你將它添加到你的問題。爲了提高可讀性(或至少格式化),您可以修剪該堆棧跟蹤。 –

+0

實際上,我修改了database.yml文件,現在它沒有得到相同的錯誤,但仍然無法正常工作。 – webdev8183

+0

看起來像缺少'default'配置的'database'選項。嘗試添加'數據庫:' – Drenmi

回答

0

如果你認爲這是因爲mysql的密碼嘗試改變mysql的密碼

$ mysqladmin -u root -p'oldpassword' password 'newpassword' 
+0

完全刪除密碼,爲用戶帳戶仍然無法正常工作,我認爲問題是在connection_specification.rb文件 – webdev8183

+0

我能夠通過紅寶石與測試腳本連接,所以問題是在配置文件中的某個地方,我只是不'理解底層配置以便修復它,這是一個恥辱,我所遵循的教程沒有任何故障排除幫助。我能夠通過這個文件連接到這些設置的'代碼'需要'mysql2' client = Mysql2 :: Client.new(host:'localhost',username:'root',password:'hiddenforsecurityreasons') sql =' show databases' result = client.query(sql) result.each do | row | \t puts row ['Database'] end 'code' – webdev8183

0

我結束了去除mysql2和使用它的一箇舊版本,手動連接器的下載的mysql-連接 - c-noinstall-6.0.2-win32的工作原理,我還添加了以下內容來捆綁配置,捆綁生成mysql2 --with-mysql-dir = c:\%pathtosqlconnectorhere%,並且我重新生成了應用程序代碼,現在rails可以創建db,我可以無誤地登錄到它。

0

您的database.yml中存在縮進問題,並且您沒有在默認連接中指定數據庫名稱。它應該看起來像這樣:

default: 
    adapter: mysql2 
    encoding: utf8 
    pool: 5 
    database: database_name 
    username: simple_cms 
    password: mypass 
    host: localhost 

development: 
    adapter: mysql2 
    encoding: utf8 
    pool: 5 
    database: simple_cms_development 
    username: simple_cms 
    password: 
    host: localhost 
    socket: /tmp/mysql.sock