ActiveRecord在什么时候实际连接到数据库?

时间:2012-02-27 23:19:56

标签: mysql ruby activerecord connection

我有一个使用ActiveRecord(2.3.12)访问MySQL数据库的ruby脚本。流程类似于“从配置文件读取数据库值”,“连接到数据库”,“创建表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似乎不是......嗯......建立连接?而对于我的生活,我无法弄清楚它应该归还什么。文档HERE肯定似乎没有任何帮助。

或者我做错了什么?请帮忙!

4 个答案:

答案 0 :(得分:3)

我通常使用 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?语句,上述代码不会对无效凭据引发任何错误。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

我同意@Luke Imhoff:从ActiveRecord的连接池手动检出的连接必须手动返回到池中。 但是,请注意,我建议使用ActiveRecord为块生成的连接

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

参考documentation of :with_connection

答案 3 :(得分:0)

我不是专家,但我总是认为establish_connection更多是连接定义,而实际连接是在使用时进行的,在这种情况下,当table_exists?运行时