我想在 Ruby 脚本中使用 mysql2 gem 连接到 mysql 数据库,但没有 Rails 或 ActiveRecord,但要读取 config/database.yml 文件以免暴露用户名称和密码直接在 Ruby 脚本中。如果我像这样使用 ActiveRecord,我可以连接:
dbconfig = YAML::load(File.open('config/database.yml'))
ActiveRecord::Base.establish_connection( dbconfig['production'] )
但是如果我对 Mysql2 连接尝试同样的技巧,我会得到一个错误:
client = Mysql2::Client.new(dbconfig['production'])
显然语法不同,我需要这样的东西:
client = Mysql2::Client.new(:host => "localhost", :username => "user", :password => 'password', :database => 'db', :socket => '/tmp/mysql.sock')
但是不想直接在脚本内部暴露用户名和密码。
那么我如何从 config/database.yml 中获取所有数据并将其传递给 Mysql2::Client.new()
方法?
谢谢。
编辑
只是想澄清一下,为了最终让它发挥作用,我通过这样做对接受的答案进行了一些修改:
client = Mysql2::Client.new(:host => dbconfig['hostname'], :username => dbconfig['username'], :password => dbconfig['password'], :database => dbconfig['database'], :socket => '/tmp/mysql.sock')
简单地执行 Mysql2::Client.new(config)
是行不通的,因为它不会获取用户名和密码。
最佳答案
任何接受哈希的方法都可以提供 YAML 解析的结果。
你可能有两个问题:
- YAML.load_file 返回一个散列,其中键是字符串而不是符号。从我读到的 https://github.com/brianmario/mysql2/blob/master/lib/mysql2/client.rb#L17和 https://github.com/brianmario/mysql2/blob/master/lib/mysql2.rb#L36 它接受符号和字符串,所以这不是问题。
- Mysql2 连接方法使用不同的键,例如在 database.yml 中使用主机而不是主机名,如果您不修改或不能修改 database.yml,您可以考虑创建一个转换键的方法。
下面的代码应该可以工作:
config = YAML::load_file("config/database.yml")["development"]
config["host"] = config["hostname"]
client = Mysql2::Client.new(config)
关于Ruby 脚本使用没有 Rails 的 database.yml 连接到 Mysql2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12688478/