Ruby net ssh和ActiveRecord 3:将它们结合在一起
我正在开发一个小型Ruby程序,它将连接到一个远程MySQL Bugzilla数据库,执行记录查询,并每天通过电子邮件将这些记录的详细信息发送给一个组 到目前为止,我已经能够通过SSH连接到db服务器并使用netssh执行命令。下面是一个例子:Ruby net ssh和ActiveRecord 3:将它们结合在一起,ruby,activerecord,net-ssh,Ruby,Activerecord,Net Ssh,我正在开发一个小型Ruby程序,它将连接到一个远程MySQL Bugzilla数据库,执行记录查询,并每天通过电子邮件将这些记录的详细信息发送给一个组 到目前为止,我已经能够通过SSH连接到db服务器并使用netssh执行命令。下面是一个例子: require 'net/ssh' Net::SSH.start("db.example.com", "sroach", :password => "secret") do |ssh| result = ssh.exec!("ls -l") pu
require 'net/ssh'
Net::SSH.start("db.example.com", "sroach", :password => "secret") do |ssh|
result = ssh.exec!("ls -l")
puts result
end
那很好
使用ActiveRecord 3.0.3,我想测试建立连接的方法,因此我建立了到本地MySQL数据库的连接,并能够使用ActiveRecord执行命令。例如:
require 'active_record'
ActiveRecord::Base.establish_connection(
:adapter => "mysql2",
:host => "localhost",
:database => "list_tool_development",
:username => "my_username",
:password => "secretpassword"
)
class MailingList < ActiveRecord::Base
end
MailingList.first #=> Successfully retrieves first record from the table
但这一切只是让我的IRB会话挂起,这可能是完全正常的…我不知道。如果挂起是正常的,我打开了一个新的IRB会话,并尝试建立与远程数据库的连接,如下所示:
require 'active_record'
ActiveRecord::Base.establish_connection(
:adapter => "mysql2",
:host => "127.0.0.1",
:port => 3307,
:reconnect => false,
:database => "bugs",
:pool => 5,
:username => "my_username",
:password => "secret",
:socket => "/tmp/mysql.sock"
)
class Bug < ActiveRecord::Base #=> the table name in the "bugs" db is "bugs"
end #=> so I made the model singular
Bug.first #=> the IRB session hangs at this point
所以,我不知道出了什么问题,也不知道如何解决。任何和所有的建议都会有帮助
我在Mac OSX上。我尝试连接到的db位于FreeBSD 7.0上,是MySQL版本14.12发行版5.0.67。您是否尝试过直接从ActiveRecord连接到db服务器,而不是尝试在SSH内通过隧道连接ActiveRecord?这是通过网络连接的正常方式,ActiveRecord直接支持这种方式 将主机ID替换为服务器主机IP或DNS条目,可能允许端口默认为MySQL驱动程序的默认值3306,并且不需要套接字,因为DB位于远程主机上
如果DB主机与您的主机不在同一网络上,并且您正在穿越防火墙,则可能需要打开该端口以允许连接。如果它在同一个网络上,它应该完全不需要ssh就可以工作。您是否试图让mysql驱动程序通过ssh隧道进行通信?它可能与服务器相关。他们可能不允许从您的计算机、网络上的计算机进行连接,或者相反,只允许从特定计算机进行连接。您可能想问一下,这是一个新的姐妹站点,专门针对数据库管理员和高级用户进行堆栈溢出。
require 'active_record'
ActiveRecord::Base.establish_connection(
:adapter => "mysql2",
:host => "127.0.0.1",
:port => 3307,
:reconnect => false,
:database => "bugs",
:pool => 5,
:username => "my_username",
:password => "secret",
:socket => "/tmp/mysql.sock"
)
class Bug < ActiveRecord::Base #=> the table name in the "bugs" db is "bugs"
end #=> so I made the model singular
Bug.first #=> the IRB session hangs at this point