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')

ただし、ユーザー名とパスワードをスクリプト内で直接公開したくはありません。

Mysql2::Client.new()config/database.yml からすべてのデータを取得してメソッドに渡すにはどうすればよいでしょうか?

ありがとう。

編集

最終的に機能させるために、これを行うことで受け入れられた回答を少し変更したことを明確にしたかっただけです。

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 解析の結果を渡すことができます。

ここで 2 つの問題が発生する可能性があります。

次のコードが機能するはずです。

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

あなたはまさにそれをするために続編を使うことができます。続編を使用する利点は、優れたRubyスタイルを使用してデータベースと通信できることです。そのドキュメントページにはたくさんの例があります。

于 2012-10-02T10:55:12.373 に答える