在使用Ubuntu的Amazon的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建立连接?
答案 0 :(得分:0)
我可以通过将 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
看起来初始数据创建可以在db / seeds.rb中完成,这是我传输Page.create代码的地方。我仍在尝试使用以下方法:
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")
答案 1 :(得分:0)
在看到与你相同的问题之后,我做了一些挖掘(正如我在下面提到你的答案的评论)。
事实证明,我遗失的基本部分是在config/environment.rb
,我正在使用
MyApp::Application.initialize
在尝试读取迁移不良的environments/{development,test, ...}.rb
文件时没有抛出错误。我用
MyApp::Application.initialize!
然后db:migrate
调用开始失败,错误显示真实问题(被initialize
(没有爆炸)调用吞没了)。我的config/development.rb
文件写得不正确,也可能是rails2 =&gt;的结果。 rails3 migration。
db:create
保存当天的原因仅仅是因为它执行ActiveRecord::Base.configurations
设置并且不依赖于环境来加载这些东西,因此在尝试读取我的错误环境时没有失败/ files。
在我的环境文件加速后,我就在路上了。
我希望这会有所帮助。