ActiveRecord :: ConnectionNotEstablished для Rails3 mysql для граблей db: перенести на EC2 - PullRequest
0 голосов
/ 24 января 2012

На Amazon EC2 с использованием Ubuntu, когда я выполняю rake db: migrate as:

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'

Я могу войти в MySQL с именем пользователя и паролем в моем файле config / database.yml и база данных есть. Так что 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 происходит в том же месте, как описано в этом посте , в ответе которого говорится, что необходимо установить соединение с 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 перед выполнением миграции?

Ответы [ 2 ]

0 голосов
/ 10 сентября 2013

Увидев ту же проблему, что и вы, я немного покопался (как упоминает мой комментарий к вашему ответу ниже).

Как оказалось, основной кусок, который я пропустил, был в моем 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 и не зависит от среды, в которой загружается этот материал, чтобы не происходило сбой при попытке прочитать мои неисправные среды / файлы.

После того, как мои файлы среды работали быстро, я уже был в пути.

Надеюсь, это поможет.

0 голосов
/ 27 января 2012

Мне удалось заставить работать миграции, добавив 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 / seed.rb, куда я и перевёл код Page.create. Я все еще пытаюсь заставить это работать, используя:

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

и я получаю сообщение об ошибке:

 uninitialized constant Page

Мне удалось исправить эту ошибку, потребовав модель в db / seed.rb, как показано ниже:

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

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