使用备份gem如何从rails database.yml获取数据库身份验证详细信息

时间:2017-09-09 16:19:00

标签: ruby-on-rails ruby backup

我正在测试备用宝石

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

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

2 个答案:

答案 0 :(得分: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
    # ...

答案 1 :(得分:0)

使用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']获取用户名,密码和其他所有内容。

  

Env vars很容易在部署之间进行更改,而无需更改任何部分   码;与配置文件不同,它们几乎没有机会   不小心检查了代码回购;和自定义配置不同   文件或其他配置机制,如Java系统属性,它们   是一种与语言和操作系统无关的标准    - https://12factor.net/config

请参阅:

相关问题