【发布时间】: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