В какой момент ActiveRecord подключается к базе данных? - PullRequest
2 голосов
/ 28 февраля 2012

У меня есть скрипт ruby, который использует ActiveRecord (2.3.12) для доступа к базе данных MySQL. Процесс выглядит примерно так: «прочитать значения базы данных из файла конфигурации», «подключиться к базе данных», «создать таблицу A, если она не существует», «загрузить и проанализировать файл», «сохранить проанализированные записи в A».

Код выглядит следующим образом:

ActiveRecord::Base.establish_connection(
  :adapter => 'mysql',
  :database => database_name,
  :username => username,
  :password => password,
  :host => "localhost",
  :port => 3306
)

  ...

ActiveRecord::Schema.define do
  create_table a, :force => true do |t|
    t.string :last_name, :limit => 60, :default => "", :null => false
    t.string :first_name, :limit => 30, :default => "", :null => false
    t.string :middle_initial, :limit => 2, :default => ""
    t.string :dob, :limit => 12, :default => "", :null => false
  end
end unless A.table_exists?

Однако, если я введу неверные учетные данные БД или несуществующее имя базы данных в метод establish_connection, сценарий, похоже, не выдаст никаких ошибок или не выдаст никаких исключений, пока я действительно не попытаюсь выполнить какую-либо операцию над база данных (т. е. создать таблицу A). Я пробовал begin-rescue-end вокруг establish_connection, но он никогда не входил в блок rescue.

Почему establish_connection кажется не совсем ... ну ... установить соединение? И за свою жизнь я не могу понять, что он вообще должен вернуть. Документы ЗДЕСЬ точно не помогут.

Или я что-то не так делаю? Пожалуйста, помогите!

Ответы [ 4 ]

3 голосов
/ 01 июня 2012

Обычно я использую оператор ActiveRecord::Base.connection.active?, чтобы проверить, действительно ли ActiveRecord подключен к базе данных.

def establish_database_connection
  begin
    ActiveRecord::Base.establish_connection config["database"]
    ActiveRecord::Base.connection.active?
    logger.info "Connected to Database"
  rescue Exception => e
    logger.error "Exception db connection :  #{e.message} "
    raise "Database connection failed"
  end
end

Без ActiveRecord :: Base.connection.active? заявление, что приведенный выше код не вызовет ошибок при неверных учетных данных.

2 голосов
/ 31 мая 2014

Решение RSK оставит соединение проверенным для текущего потока. Если вы не хотите этого, попробуйте это (адаптировано из https://gist.github.com/limhoff-r7/71ee6b1568b604e131a8,, который предназначен только для Postgres):

ActiveRecord::Base.establish_connection

# Check if the spec passed to `ActiveRecord::Base.establish_connection` can connect to the database.
#
# @return [true] if an active connection can be made to the database using the current config.
# @return [false] if an active connection cannot be made to the database.
def connection_established?
  begin
    # use with_connection so the connection doesn't stay pinned to the thread.
    ActiveRecord::Base.connection_pool.with_connection {
      ActiveRecord::Base.connection.active?
    }
  rescue Exception
    false
  end
end
1 голос
/ 27 февраля 2015

Я согласен с @Luke Imhoff: соединения, которые извлекаются вручную из пула соединений ActiveRecord, должны быть вручную возвращены в пул. Однако в качестве примечания я предлагаю использовать соединение, которое ActiveRecord передает в блок

ActiveRecord::Base.connection_pool.with_connection { |con| con.active? }

Ссылаясь на документацию: with_connection :

0 голосов
/ 28 февраля 2012

Я не эксперт, но я всегда предполагал, что establish_connection было скорее определением соединения, тогда как фактическое соединение устанавливается, когда оно используется, в данном случае, когда table_exists? запускает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...