【问题标题】:Using the backup gem how can I get database authentications details from rails database.yml使用备份 gem 如何从 rails database.yml 获取数据库身份验证详细信息
【发布时间】:2017-09-09 16:19:00
【问题描述】:

我正在测试备份 gem

http://backup.github.io/backup/v4/utilities/

我知道我必须创建一个带有示例配置的 db_backup.rb

Model.new(:my_backup, 'My Backup') do
  database MySQL do |db|
    # To dump all databases, set `db.name = :all` (or leave blank)
    db.name               = "my_database_name"
    db.username           = "my_username"
    db.password           = "my_password"
    db.host               = "localhost"
    db.port               = 3306

但是我不知道如何从 Rails database.yml 获取这些详细信息。我试过这样的事情:

  env = defined?(RAILS_ENV) ? RAILS_ENV : 'development'
  @settings = YAML.load(File.read(File.join( "config", "database.yml")))

但我想应该有更好的方法。

【问题讨论】:

    标签: ruby-on-rails ruby backup


    【解决方案1】:

    我会这样做:

    env = defined?(RAILS_ENV) ? RAILS_ENV : 'development'
    config = YAML.load_file(File.join('config', 'database.yml'))[env]
    
    Model.new(:my_backup, 'My Backup') do
      database MySQL do |db|
        config.each_pair do |key, value|
          db.public_send("#{key}=", value)
        end
        # ...
    

    【讨论】:

      【解决方案2】:

      使用 ActiveRecord 自己的配置处理:

      require 'active_record'
      require 'yaml'
      
      Model.new(:my_backup, 'My Backup') do
        database MySQL do |db|
          config = {
            # these are the default values
            host: 'localhost'
            port: 3306
          }.merge(load_configuration(ENV['RAILS_ENV'] || 'development'))
          config.each_pair do |key, value|
            db.public_send("#{key}=", value)
          end
        end
      
        # this loads the configuration from file and memoizes it
        def load_configuration(env)
          @file_config ||= YAML.load(File.read(File.join( "config", "database.yml")))  
          @configurations ||= ActiveRecord::ConnectionHandling::MergeAndResolveDefaultUrlConfig.new(file_config).resolve
          @configurations[env]
        end
      end
      

      这里的关键优势是它将合并来自ENV['DATABASE_URL'] 的值。这一点非常重要,因为您应该避免将数据库凭据添加到 config/database.yml。

      一个好习惯是在database.yml 中仅指定连接适配器和基本要素。使用ENV['DATABASE_URL'] 作为用户名、密码和其他所有内容。

      环境变量很容易在部署之间更改,而无需更改任何内容 代码;与配置文件不同,它们几乎没有机会 意外签入代码仓库;和自定义配置不同 文件或其他配置机制,例如 Java 系统属性,它们 是一种与语言和操作系统无关的标准。
      - https://12factor.net/config

      见:

      【讨论】:

        猜你喜欢
        • 2019-01-27
        • 1970-01-01
        • 1970-01-01
        • 2012-09-15
        • 1970-01-01
        • 1970-01-01
        • 2021-01-06
        • 2010-11-13
        • 1970-01-01
        相关资源
        最近更新 更多