7

我想在 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)是行不通的,因为它不会获取用户名和密码。

4

3 回答 3

11

任何接受散列的方法都可以得到 YAML 解析的结果。

您在这里可能有两个问题:

以下代码应该可以工作:

config = YAML::load_file("config/database.yml")["development"]
config["host"] = config["hostname"]

client = Mysql2::Client.new(config)
于 2012-10-02T15:34:50.667 回答
1

我的解决方案类似于接受的答案,除了我database.yml有用于环境变量引用的 erb 片段:

development:
  <<: *default
  database: <%= ENV['DEV_DB_NAME'] %>
  username: <%= ENV['DEV_DB_USER'] %>
  password: <%= ENV['DEV_DB_PASS'] %>

所以我先通过ERB加载:

require 'erb'
require 'mysql2'

config = YAML.load(ERB.new(
  File.new("config/database.yml").read).result(binding))['development']
config["host"] = config["hostname"]
client = Mysql2::Client.new(config)

认为它可能对其他人有所帮助,因为这是我找到的第一个搜索结果。感谢问题和接受的答案!

于 2016-05-15T08:40:41.607 回答
-1

您可以使用续集来做到这一点。使用 sequel 的优点是您可以使用良好的 Ruby 风格与您的数据库对话。它的文档页面上有很多示例。

于 2012-10-02T10:55:12.373 回答