【问题标题】:ActiveRecord::ConnectionNotEstablished for Rails3 mysql for rake db:migrate on EC2ActiveRecord::ConnectionNotEstablished for Rails3 mysql for rake db:migrate on EC2
【发布时间】:2012-01-23 21:27:31
【问题描述】:

在使用 Ubuntu 的亚马逊 EC2 上,当我执行 rake db:migrate 为:

bundle exec rake db:migrate RAILS_ENV="production" --trace

我收到如下错误ActiveRecord::ConnectionNotEstablished

 ** Invoke db:migrate (first_time)
 ** Invoke environment (first_time)
 ** Execute environment
 ** Execute db:migrate
 rake aborted!
 ActiveRecord::ConnectionNotEstablished
 /usr/local/rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.0.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:316:in `retrieve_connection'

我可以使用 config/database.yml 文件中的用户名和密码登录 mysql 并且数据库在那里。所以mysql正在运行,这不是问题。

我的 config/database.yml 文件如下所示:

 production:
   adapter: mysql2
   encoding: utf8
   reconnect: false
   database: app_production
   pool: 5
   username: root
   password: password
   host: localhost
   socket: /run/mysqld/mysqld.sock

这是我的宝石列表中的宝石:

 abstract (1.0.0)
 actionmailer (3.0.3)
 actionpack (3.0.3)
 activemodel (3.0.3)
 activerecord (3.0.3)
 activeresource (3.0.3)
 activesupport (3.0.3)
 arel (2.0.10)
 builder (2.1.2)
 bundler (1.0.10 ruby)
 cgi_multipart_eof_fix (2.5.0)
 daemons (1.0.10)
 erubis (2.6.6)
 eventmachine (0.12.10)
 fastthread (1.0.7)
 gem_plugin (0.2.3)
 i18n (0.6.0)
 mail (2.2.19)
 mime-types (1.17.2)
 mongrel (1.2.0.pre2)
 mysql2 (0.2.7)
 polyglot (0.3.3)
 rack (1.2.5)
 rack-mount (0.6.14)
 rack-test (0.5.7)
 rails (3.0.3)
 railties (3.0.3)
 rake (0.9.2.2)
 rmagick (2.13.1)
 thin (1.2.7)
 thor (0.14.6)
 treetop (1.4.10)
 tzinfo (0.3.31)
 xmpp4r (0.5)

connection_pool.rb 中的错误发生在post 中描述的相同位置,其回答说需要在 ActiveRecord::Base 上建立连接。 connection_pool.rb 中的代码失败,因为它被发送 klass = ActiveRecord::Base 没有连接。所以我尝试创建一个模型 my_connection_base.rb,如下所示

 require 'active_record'

 class MyConnectionBase < ActiveRecord::Base

      MyConnectionBase.establish_connection(
        :adapter => "mysql2",
        :host => "localhost",
        :username => "<your database username>",
        :password => "<your database password>",
        :database => File.dirname(__FILE__) + "app_production"
      )
   self.abstract_class = true
 end

然后我的所有模型都继承 MyConnectionBase,如下面的 role.rb:

require 'my_connection_base'

class Role < MyConnectionBase
  has_and_belongs_to_many :users
end

但是当我尝试运行迁移时,我仍然得到 ActiveRecord::ConnectionNotEstablished。我还需要对 Rails 3 做些什么来确保在执行迁移之前与 mysql 建立连接?

【问题讨论】:

  • /run/mysqld/mysqld.sock 是 MySQL 套接字的实际位置吗?上周我对这个问题进行了故障排除,发现它实际上是在/tmp/mysqld.sock
  • @Michael - 这是我检查的第一件事。实际的套接字是 /var/run/mysqld/mysqld.sock 并且 /run/mysqld/mysqld.sock 是它的链接,即 ls -l /run/mysqld/mysqld.sock 给出:/run/mysqld/mysqld。袜子-> /var/run/mysqld/mysqld.sock。这就引出了一个问题,如何检查套接字是否正常工作?
  • 如果可以在命令行上连接,说明socket工作正常。
  • @Michael - /tmp/mysqld.sock 中没有文件。
  • @Michael - 是的,这让我感到困惑的是我可以在命令行上很好地连接到 mysql。我还将数据库的权限授予为 - 将 app_production.* 上的所有权限授予由“密码”标识的“用户名”@“本地主机”;

标签: mysql ruby-on-rails-3 activerecord amazon-ec2 rake


【解决方案1】:

我能够通过将 db:create 添加到 rake 命令行来使迁移工作,如下所示:

 bundle exec rake db:create db:migrate RAILS_ENV="production" 

我不知道为什么现在需要 db:create。我没有提到的一件事是这些迁移是从 Rails 2 应用程序转移到 Rails 3 应用程序的。我仍然无法在迁移中创建页面,如下所示我注释掉的 Page.create 部分:

20101014205123_create_pages.rb

 class CreatePages < ActiveRecord::Migration
   def self.up
     create_table :pages do |t|
       t.column :title, :string
       t.column :permalink, :string
       t.column :body, :text
       t.column :created_at, :datetime
       t.column :updated_at, :datetime
       t.timestamps
     end

 #   Page.create(:title => "Home",
 #               :permalink => "welcome-page",
 #               :body => "Welcome to Home")

   end

   def self.down
     drop_table :pages
   end
 end

看起来初始数据创建也可以在我传输 Page.create 代码的 db/seeds.rb 中完成。我仍在尝试使用:

 bundle exec rake db:create db:seed RAILS_ENV="production" --trace

我得到了错误:

 uninitialized constant Page

我可以通过要求 db/seeds.rb 中的模型来修复这个错误,如下所示:

require File.expand_path('../../app/models/page', __FILE__)

Page.create(:title => "Home",
            :permalink => "welcome-page",
            :body => "Welcome to Home")

【讨论】:

  • 我在将站点从 Rails2 升级到 Rails3 时遇到了同样的问题。虽然我还没有找到解决方案,但我确实注意到运行rake db:migrate:status 报告“开发数据库未配置”。如果深入rails代码,我发现配置实际上并没有在ActiveRecord::Base中设置。似乎某处 db:create 正在选择 db:migrate 没有的配置。我会继续调查。
【解决方案2】:

在看到与您相同的问题后,我进行了一些挖掘(正如我在下面对您的回答的评论中提到的那样)。

事实证明,我缺少的基本部分在我的config/environment.rb 中,我正在使用

MyApp::Application.initialize

当它试图读取我迁移不佳的environments/{development,test, ...}.rb 文件时没有抛出错误。我用

替换了初始化调用
MyApp::Application.initialize!

然后db:migrate 调用开始失败,错误显示真正的问题(被initialize(没有爆炸)调用吞没了)。我的 config/development.rb 文件没有正确写入,也可能是 rails2 => rails3 迁移的结果。

db:create 保存这一天的原因仅仅是因为它进行了ActiveRecord::Base.configurations 设置并且不依赖于环境来加载这些内容,因此在尝试读取我的错误环境/文件时它没有失败。

在让我的环境文件加快速度后,我就在路上了。

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 2012-04-05
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多