2015-04-07 3 views
2

Моя база данных MySQL работает на localhost. Самолет mysql2 установлен без ошибок. Мне никогда не удалось подключиться, независимо от того, какой логин я использовал.База данных `AdapterNotSpecified` не настроена

Пароль root содержит #, который является символом комментария в редакторе 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 и теперь ошибка изменилась незначительно.

default: 
adapter: mysql2 
encoding: utf8 
pool: 5 
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 

И, наконец, мой 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 базы данных.yml - предлагаю добавить ее к вашему вопросу. Вы можете обрезать трассировку стека в интересах повышения удобочитаемости (или, по крайней мере, форматировать) –

+0

Фактически я изменил файл database.yml, теперь он не получает ту же ошибку, но он все еще не работает. – webdev8183

+0

Похоже, вам не хватает опции 'database' для конфигурации' default'. Попробуйте добавить 'database: ' – Drenmi

ответ

0

Если вы думаете, что это из-за тузд пароля попробуйте изменить пароль MySQL

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

полностью удалил пароль, поскольку учетная запись пользователя все еще не работает, я думаю, что проблема связана с файлом connection_specification.rb. – webdev8183

+0

Я могу подключиться к тестовому сценарию через ruby, поэтому проблема находится где-то в файлах конфигурации, t понять базовую конфигурацию достаточно хорошо, чтобы ее исправить, что является позором для учебного пособия, за которым я следую, не имеет помощи по устранению неполадок. Я могу подключиться через этот файл с этими настройками «код» требует «mysql2» client = Mysql2 :: Client.new (хост: «localhost», имя пользователя: «root», пароль: «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%, и я восстановил код приложения, теперь рельсы могут создавать db, и я могу войти в систему без ошибок.

0

В вашей базе данных есть проблема с отступом, и вы не указали имя базы данных в своем соединении по умолчанию. Это должно выглядеть так:

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 
Смежные вопросы