【问题标题】:Rails and MySQL - ActiveRecord::ConnectionNotEstablished in production environmentRails 和 MySQL - 生产环境中的 ActiveRecord::ConnectionNotEstablished
【发布时间】:2012-02-04 17:49:54
【问题描述】:

我会尽量简短:
对数据库使用 Rails 3.2.1mysql2;在 Ubuntu 11.10 上运行
开发 环境中一切正常
当我在 production 中启动我的服务器 (WEBrick) 时,它可以正常启动,但在加载任何页面后,它会引发以下错误:

ActiveRecord::ConnectionNotEstablished (ActiveRecord::ConnectionNotEstablished):
activerecord (3.2.1)
lib/active_record/connection_adapters/abstract/connection_pool.rb:374:in
retrieve_connection'
activerecord (3.2.1)
lib/active_record/connection_adapters/abstract/connection_specification.rb:168:in
`retrieve_connection'
activerecord (3.2.1)
lib/active_record/connection_adapters/abstract/connection_specification.rb:142:in
`connection'
...
/home/metjush/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/httpserver.rb:138:in
`service'
/home/metjush/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/httpserver.rb:94:in `run'
/home/metjush/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/server.rb:191:in `block
in start_thread'

在尝试找到任何可能的错误来源,并咨询了十亿个不同的网站和类似的报告后,我仍然无法找到问题所在。我的 database.yml (现在在 localhost 上运行,并且我在生产环境中的设置与开发环境中的设置相同)很好,我的 Gemfile 没问题(gem 'mysql2' 包括在内,不用担心),生产数据库已创建并且 rake db:migrate 迁移它没有问题...我没有想到或在互联网上没有找到的任何其他可能的错误来源?

我强调,这只发生在生产中

感谢您的帮助


编辑发布我的 Gemfile:

source 'https://rubygems.org'

gem 'rails', '3.2.1'

gem 'mysql2'

# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails',   '~> 3.2.3'
  gem 'coffee-rails', '~> 3.2.1'
  gem 'uglifier', '>= 1.0.3'
end

gem 'jquery-rails'

gem 'bcrypt-ruby', :require => 'bcrypt'
gem 'rufus-scheduler'
gem 'gmaps4rails'

希望这会有所帮助 - 虽然我真的没有发现它有什么问题。

编辑两个
奇怪的是,当我在生产环境中启动 rails 控制台时,我没有任何问题 - MySQL 查询工作,模型实例可以毫无问题地保存。当我尝试从浏览器访问数据库时,我只会收到上述错误。

【问题讨论】:

  • 如果你将\config\environment\development.rb复制到\config\environment\production.rb,是否有效?
  • 您的本地主机上是否正确设置了usernamepassword?仅当 rails 无法连接到 db 服务器或数据库时才会发生这种情况。
  • development.rb 复制到production.rb 并没有改变任何东西,仍然是同样的错误。
  • 因为我的 localhost 有一个用户名和一个密码,并且在 database.yml 中为开发和生产设置了相同的用户名和密码,这不可能是原因

标签: mysql ruby-on-rails ruby


【解决方案1】:

对我来说,它归结为配置错误的 database.yml 文件。要确认格式正确,您可以从 .yml 文件所在的目录执行以下操作:

irb 
require 'yaml'
a = YAML::load(File.open("database.yml"))

如果您遇到错误,您会看到类似这样的响应...

irb(main):001:0> require 'yaml'
=> true
irb(main):002:0> a = YAML::load(File.open("database.yml"))
Psych::SyntaxError: (<unknown>): could not find expected ':' while scanning a simple key at line 17 column 3
        from C:/Ruby193/lib/ruby/1.9.1/psych.rb:203:in `parse'
        from C:/Ruby193/lib/ruby/1.9.1/psych.rb:203:in `parse_stream'
        from C:/Ruby193/lib/ruby/1.9.1/psych.rb:151:in `parse'
        from C:/Ruby193/lib/ruby/1.9.1/psych.rb:127:in `load'
        from (irb):2
        from C:/Ruby193/bin/irb:12:in `<main>'

在我的例子中,我在输入数据库密码时忘记在“:”后面留一个空格。

【讨论】:

    【解决方案2】:

    我有同样的问题。 Spree 最新版本仍然不兼容 rails 3.2.0/3.2.1 所以使用 rails 3.1.3 和最新的 spree 版本

    在我的例子中,rails 版本是 3.2.0,spree 默认版本是 0.40.0。我将 spree 版本更改为 1.0.0.rc3,这向我展示了 rails 兼容性问题,所以我将 rails 版本更改为 3.1.3,一切正常。

    你可以使用最新的 spree 稳定版本,我猜它是 0.70.3。

    【讨论】:

    • 谢谢。但我没有使用 spree,所以这不是问题。
    • 很抱歉,我把它发到了错误的线程上,本来打算在狂欢问题中发布
    • 很高兴这是在这里。我实际上有完全相同的问题。但现在我们已经到了 Spree 1.0.3。我尝试了 Rails 3.1.3 和 3.1.4 无济于事。
    【解决方案3】:

    你必须先创建一个mysql数据库。然后转到您的应用程序目录并使用您的数据库信息编辑 database.yml 文件 (~/config/database.yml)。

    喜欢:

    development:
    adapter: msql2
    database: your database path
    username: mysql username
    password: mysql password
    pool: 5
    timeout: 5000
    

    【讨论】:

      【解决方案4】:

      我在 Rails 引擎 gem 中遇到了类似的问题,并最终将其追踪到其中一个类的范围声明(例如:范围:owing,where...)。注释掉解决了ActiveRecord::ConnectionNotEstablished,但导致规范失败(显然)。

      引擎正在使用 Combustion gem 来包含一个用于规范的缩小 Rails 应用程序,无论数据库类型如何,都会出现问题。希望在某种程度上有所帮助。

      编辑:Here's a rails issue for it

      【讨论】:

      • 我也没有使用 Combustion gem,所以我认为这应该不是问题...
      • 将每个作用域声明的主体放在一个 lambda 块中让我现在可以解决这个问题。似乎它仍然是 Rails 3.2.8 中的一个问题。
      【解决方案5】:

      您可能已经开始使用此页面,但如果其他人访问此页面,请尝试以下几件事。

      当您尝试以生产模式启动服务器时,您确定没有拼写错误吗?

      bundle exec rails s --environment=production
      

      如果“生产”中存在拼写错误,rails 在尝试启动服务器时不会抱怨,但它会尝试在 database.yml 文件中查找该拼写错误,并且由于它不存在,您将收到错误消息提到

      要尝试的另一件事:检查您的 database.yml 文件的格式是否正确。 YAML 对制表符和空格非常挑剔,因此请在控制台中执行以下操作来仔细检查

      irb 
      require 'yaml'
      a = YAML::load(File.open("config/database.yml"))
      

      如果你得到一个哈希值,那么你的文件是好的,否则修复返回的问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-05
        • 1970-01-01
        • 2015-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-30
        相关资源
        最近更新 更多