Why is rails trying to connect to mysql?

匿名 (未验证) 提交于 2019-12-03 02:29:01

问题:

I have been using mysql in a new rails application, but now I wanted to give mongoDB a try so I installed mongo mapper and mongoid (to use mongo session). The installation seems to be fine because I can create mongo models. But for some reason rails is still trying to connect to mysql: Can't connect to local MySQL server.

This is horrible, because even if I wasn't using mongo, rails shouldn't be trying to connect to mysql for every request. It's throwing that error even for non-existent urls.

What can I do to debug this? I guess I could try removing the mysql gem from the Gemfile and running bundle install. But I still don't like the fact that it's trying to connect even when I'm not using it. Shouldn't it try to connect 'lazily' (ie: only on demand)?

development.rb:

Myapp::Application.configure do   # Settings specified here will take precedence over those in config/application.rb    # In the development environment your application's code is reloaded on   # every request. This slows down response time but is perfect for development   # since you don't have to restart the web server when you make code changes.   config.cache_classes = false    # Log error messages when you accidentally call methods on nil.   config.whiny_nils = true    # Show full error reports and disable caching   config.consider_all_requests_local       = true   config.action_controller.perform_caching = false    # Don't care if the mailer can't send   config.action_mailer.raise_delivery_errors = false    # Print deprecation notices to the Rails logger   config.active_support.deprecation = :log    # Only use best-standards-support built into browsers   config.action_dispatch.best_standards_support = :builtin    # Raise exception on mass assignment protection for Active Record models   config.active_record.mass_assignment_sanitizer = :strict    # Log the query plan for queries taking more than this (works   # with SQLite, MySQL, and PostgreSQL)   config.active_record.auto_explain_threshold_in_seconds = 0.5    # Do not compress assets   config.assets.compress = false    # Expands the lines which load the assets   config.assets.debug = true end 

application.rb:

require File.expand_path('../boot', __FILE__)  require 'rails/all'  if defined?(Bundler)   # If you precompile assets before deploying to production, use this line   Bundler.require(*Rails.groups(:assets => %w(development test)))   # If you want your assets lazily compiled in production, use this line   # Bundler.require(:default, :assets, Rails.env) end  module Myapp   class Application < Rails::Application # Settings in config/environments/* take precedence over those specified here. # Application configuration should go into files in config/initializers # -- all .rb files in that directory are automatically loaded.  # Custom directories with classes and modules you want to be autoloadable. # config.autoload_paths += %W(#{config.root}/extras)  # Only load the plugins named here, in the order given (default is alphabetical). # :all can be used as a placeholder for all plugins not explicitly named. # config.plugins = [ :exception_notification, :ssl_requirement, :all ]  # Activate observers that should always be running. # config.active_record.observers = :cacher, :garbage_collector, :forum_observer  # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. # config.time_zone = 'Central Time (US & Canada)'  # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] # config.i18n.default_locale = :de  # Configure the default encoding used in templates for Ruby 1.9. config.encoding = "utf-8"  # Configure sensitive parameters which will be filtered from the log file. config.filter_parameters += [:password]  # Use SQL instead of Active Record's schema dumper when creating the database. # This is necessary if your schema can't be completely dumped by the schema dumper, # like if you have constraints or database-specific column types # config.active_record.schema_format = :sql  # Enforce whitelist mode for mass assignment. # This will create an empty whitelist of attributes available for mass-assignment for all models # in your app. As such, your models will need to explicitly whitelist or blacklist accessible # parameters by using an attr_accessible or attr_protected declaration. # config.active_record.whitelist_attributes = true  # Enable the asset pipeline config.assets.enabled = true  # Version of your assets, change this if you want to expire all your assets config.assets.version = '1.0'  config.generators do |g|   g.orm :mongo_mapper end   end end 

回答1:

When ActiveRecord is part of application, it tries to establish connection to database at startup. If it fails to connect, application won't start.

The problem is here:

require 'rails/all' 

This line includes all "usual" rails components, ActiveRecord among them. If you go to its definition, it should look like this (for rails 3.2):

require "rails"  %w(   active_record   action_controller   action_mailer   active_resource   rails/test_unit   sprockets ).each do |framework|   begin     require "#{framework}/railtie"   rescue LoadError   end end 

Take this code, remove active_record line and put it instead your rails/all line. Now, ActiveRecord isn't included and your application will loudly fail when it sees ActiveRecord references in the code, like this:

config.active_record.mass_assignment_sanitizer = :strict 

You need to remove these too. You don't need to delete database.yml, but you probably should, since it has no meaning now.



回答2:

You need delete the line where you configure activerecord :

# Raise exception on mass assignment protection for Active Record models config.active_record.mass_assignment_sanitizer = :strict  # Log the query plan for queries taking more than this (works # with SQLite, MySQL, and PostgreSQL) config.active_record.auto_explain_threshold_in_seconds = 0.5 


回答3:

i presume you've checked your database.yml to make sure nothing is looking for adapter: mysql?

Also if you've left mysql in your Gemfile then the mysql gem will bomb out as it can't do it's part and therefore has to fail as a dependency. Remove it + rerun.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!