Ruby脚本使用database.yml连接到Mysql2,无需Rails

Ruby脚本使用database.yml连接到Mysql2,无需Rails,ruby,yaml,mysql2,Ruby,Yaml,Mysql2,我希望在Ruby脚本中使用mysql2 gem连接到mysql数据库,但是不使用Rails或ActiveRecord,而是读取config/database.yml文件,以免直接在Ruby脚本中暴露用户名和密码。如果我像这样使用ActiveRecord,我可以连接: dbconfig = YAML::load(File.open('config/database.yml')) ActiveRecord::Base.establish_connection( dbconfig['productio

我希望在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)将不起作用,因为它不会获取用户名和密码。

您可以使用它来执行此操作。使用sequel的优点是,您可以使用良好的Ruby风格与db对话。在它的文档页面上有很多例子。

任何接受哈希的方法都可以用YAML解析的结果提供

您可能有两个问题:

  • load_文件返回一个散列,其中键是字符串而不是符号。从我读到的和它接受符号和字符串,所以这不是问题所在。
  • MySqL2 Connect方法使用不同的密钥,比如主机,而不是数据库中的主机名。YML,您可以考虑创建一个方法,如果您不修改或修改数据库,则可以转换密钥。李>
以下代码应该可以工作:

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

client = Mysql2::Client.new(config)

我的解决方案与公认的答案类似,除了我的
数据库。yml
有erb代码段用于环境变量引用:

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

我想这可能会帮助其他人,因为这是我找到的第一个搜索结果。感谢您的提问和公认的答案

sequel看起来很有趣,但在快速浏览页面后,我看不到哪里可以使用database.yml文件连接到它。我看到的所有连接选项都在文件中指定了用户和密码。
DB=Sequel.connect('postgres://localhost/blog“:user=>user,:password=>password)
您可以将
user
password
放入一个单独的文件,如
user=“me”;PSSWORD=“secret”
然后
需要“文件”
所以。。。这是如何实现原始问题中的“从database.yml读取”的?对不起,是-1。@aqn,当然不是。被接受的答案也没有,因为ORM不必读取yml文件。因此,我提供了另一种访问和提供安全用户名/密码存储的方法。显然,您也可以使用YAML文件,并要求YAML库浪费一点额外内存来完成一些不需要的事情。@3:请记住,这可能是作为一个更大项目的一部分来完成的,使用database.yml可能有很好的理由。即使你认为原因不太好,但实际上还是由他们决定他们想要采取什么方法,告诉他们应该做一些与问题中指定的不同的事情也没有什么帮助。我已经添加了一个答案,该答案应该涵盖你的需要,但你可能还有另一个问题,如果我的答案不合适,您介意粘贴错误吗?我应该直接向
Client.new(config)
说明这一点。我必须分别指定字段。看看问题中的编辑,看看我的意思。啊,是的,这比解决关键点的差异更简单,我不知道我的脑袋在哪里,昨天不建议:)
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)