我有一个使用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肯定似乎没有任何帮助。
或者我做错了什么?请帮忙!
答案 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? }
答案 3 :(得分:0)
我不是专家,但我总是认为establish_connection
更多是连接定义,而实际连接是在使用时进行的,在这种情况下,当table_exists?
运行时