【问题标题】:Can you get DB username, pw, database name in Rails?你能在 Rails 中获取数据库用户名、密码、数据库名称吗?
【发布时间】:2010-09-28 19:15:27
【问题描述】:

我正在编写一个 rake 任务,该任务在 Rails/ActiveRecord 之外执行一些数据库工作。

有没有办法获取database.yml 中定义的当前环境的数据库连接信息(主机、用户名、密码、数据库名称)?

我想得到它,这样我就可以用它来像这样连接......

con = Mysql.real_connect("host", "user", "pw", "current_db")

【问题讨论】:

    标签: ruby-on-rails ruby database activerecord environment


    【解决方案1】:

    您可以在 rails 中创建一个配置对象并从中获取必要的信息:

    config   = Rails.configuration.database_configuration
    host     = config[Rails.env]["host"]
    database = config[Rails.env]["database"]
    username = config[Rails.env]["username"]
    password = config[Rails.env]["password"]
    

    有关 Rails::Configuration 的详细信息,请参阅documentation

    这只是使用YAML::load从数据库配置文件(database.yml)加载配置,您可以使用它自己从rails环境之外获取信息:

    require 'YAML'
    info = YAML::load(IO.read("database.yml"))
    print info["production"]["host"]
    print info["production"]["database"]
    ...
    

    【讨论】:

    • 在较新的Rails中,您不需要创建配置,您可以通过Rails.configuration获取它
    • 对于 rails 3.0.0,需要 'yaml' 和 YAML::load(IO.read("config/database.yml")) 工作正常!
    • 如果其中一些有 nil 值(在我的例子中:主机、用户名和密码),Rails 会使用什么默认值?
    • 谨慎使用 YAML - 现代版本的 Rails 也将首先通过 ERB 过滤文件内容。
    • @ BryanLarsen你能阐述?̶̶̶R̶a̶i̶l̶s̶.̶c̶o̶n̶f̶i̶g̶u̶r̶a̶t̶i̶o̶n̶̶那么什么是不同的从应答?̶也许答案从原始被编辑。我看到@KenB 的回答。
    【解决方案2】:

    Bryan 在上述评论中的回答值得更多曝光:

    >> Rails.configuration.database_configuration[Rails.env]
    => {"encoding"=>"unicode", "username"=>"postgres", "adapter"=>"postgresql", "port"=>5432, "host"=>"localhost", "password"=>"postgres", "database"=>"mydb", "pool"=>5}
    

    【讨论】:

    • 在 Heroku 上升级到 Rails 4.1,我不得不将此行切换为:ActiveRecord::Base.configurations[Rails.env]
    【解决方案3】:
    ActiveRecord::Base.connection_config
    

    以散列形式返回连接配置:

    => {:adapter=>ADAPTER_NAME, :host=>HOST, :port=>PORT, 
        :database=>DB, :pool=>POOL, :username=>USERNAME, 
        :password=>PASSWORD} 
    

    正如tpett 在他们的评论中所说:此解决方案用于合并来自database.yml 和环境变量DATABASE_URL 的配置。

    【讨论】:

    • 这似乎是唯一一个将database.yml 配置与DATABASE_URL 环境变量合并的原因。
    • 我不能代表任何人,但这是完美的。我想以编程方式仔细检查我指向的数据库是否正确
    【解决方案4】:

    我认为这是最简单的解决方案。经过一些测试(至少在 Rails 5.2 中)这将正确解析 DATABASE_URL。

     ActiveRecord::Base.configurations[Rails.env]
    

    【讨论】:

      【解决方案5】:

      从 Rails 6.1 开始,ActiveRecord::Base.connection_config 已弃用。较新的访问器是ActiveRecord::Base.connection_db_config

      [1] pry(main)> ActiveRecord::Base.connection_db_config
      => #<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007fe04ae72e58
       @configuration_hash=
        {:adapter=>"postgresql",
         :encoding=>"utf8",
         :min_messages=>"WARNING",
         :host=>"localhost",
         :username=>"postgres",
         :password=>"P@ssw0rd",
         :port=>5432,
         :database=>"myapp_development"},
       @env_name="development",
       @name="primary">
      

      【讨论】:

        【解决方案6】:

        老问题,但这是我查找如何执行此操作的第一站之一,因此我认为这可能对其他人有所帮助。我通常在主目录中有 .my.cnf 文件。因此,在我的 database.yml 配置文件中使用 'parseconfig' gem 和一些 ERB 语法意味着我有动态文件,我可以很好地检查源代码控制并简化部署(在我的情况下)。另请注意常用套接字列表,这样可以更轻松地将我的应用程序移动到可能具有不同 Unix 套接字路径的不同操作系统。

        <% 
            require 'parseconfig'
            c=ParseConfig.new('../../.my.cnf') %>
        
        mysqlevn: &mysql
          adapter: mysql 
          username: <%= c.params['client']['user'] %>
          password: <%= c.params['client']['password'] %>
          host: localhost 
          socket: <%= [ 
          '/var/run/mysqld/mysqld.sock',
          '/var/lib/mysql/mysql.sock',
          '/tmp/mysqld.sock',
          '/tmp/mysql.sock'].detect { |socket| File.exist?(socket) } %>
        
        production:
          database: app_production
          <<: *mysql
        
        
        development:
          database: app_development 
          <<: *mysql
        
        # Do not set this db to the same as development or production.
        test:
          database: app_test
          <<: *mysql
        

        参考:http://effectif.com/articles/database-yml-should-be-checked-in

        【讨论】:

          【解决方案7】:

          在 Rails 6.1+ 中,您可以使用:

          ActiveRecord::Base.connection_db_config.configuration_hash
          

          这会返回一个包含当前环境的连接信息的哈希:

          {
            :adapter=>"postgresql",
            :encoding=>"utf8",
            :min_messages=>"WARNING",
            :host=>"localhost",
            :username=>"postgres",
            :password=>"P@ssw0rd",
            :port=>5432,
            :database=>"my_app_development"
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-02-13
            • 2010-12-12
            • 1970-01-01
            • 2012-08-28
            • 1970-01-01
            • 2012-09-27
            相关资源
            最近更新 更多