【问题标题】:Why does my rails app ignore the env var DATABASE_URL at console startup?为什么我的 Rails 应用程序在控制台启动时忽略 env var DATABASE_URL?
【发布时间】:2014-09-20 14:30:56
【问题描述】:

tl;博士:

$ export DATABASE_URL=postgres://user:pwd@localhost:5432/new_db
$ RAILS_ENV=test bundle exec rails c
[1] pry(main)> ActiveRecord::Base.connection.current_database
=> "test"
[2] pry(main)> ActiveRecord::Base.establish_connection;nil
=> nil
[3] pry(main)> ActiveRecord::Base.connection.current_database
=> "new_db"
[4] pry(main)> # WTF ?!?

背景:我们目前正在主持几项工作,以构建、测试并将我们的 DEV 和 QA 环境推送到 heroku。由于我们在 database.yml 文件中有相同的测试配置,当两个 env 同时测试时,我们最终会失败,因此我们决定使用两个数据库。

我们正在尝试什么:为了实现这一点(使用具有相同 database.yml 文件的多个数据库),我们决定将 DATABASE_URL 环境变量的值设置为 'postgres://user: pwd@localhost:5432/new_db'。

问题是什么:DATABASE_URL 的值似乎只在我们在控制台中手动运行建立连接时使用。奇怪的是,运行 rake 对正确的 db (new_db) 有影响。

Rails 版本是 3.2.19

有没有办法正确地覆盖该环境变量?

提前非常感谢!

【问题讨论】:

    标签: ruby-on-rails postgresql activerecord ruby-on-rails-3.2


    【解决方案1】:

    您在 config/initializers 中有一个执行此操作的文件:

    Rails.application.config.after_initialize do
      ActiveRecord::Base.connection_pool.disconnect!
    
      ActiveSupport.on_load(:active_record) do
        config = Rails.application.config.database_configuration[Rails.env]
        config['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 10 # seconds
        config['pool']              = ENV['DB_POOL'] || 5
        ActiveRecord::Base.establish_connection(config)
      end
    end
    

    这个文件说:总是从database.yml加载配置,并添加reaing_frequencypool这两个参数。

    把初始化器改成这样可以解决问题:

    Rails.application.config.after_initialize do
      ActiveRecord::Base.connection_pool.disconnect!
    
      ActiveSupport.on_load(:active_record) do
        if !ENV['DATABASE_URL']
          config = Rails.application.config.database_configuration[Rails.env]
          config['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 10 # seconds
          config['pool'] = ENV['DB_POOL'] || 5
          ActiveRecord::Base.establish_connection(config)
        else
          ActiveRecord::Base.establish_connection
        end
      end
    end
    

    注意:默认的 rails 行为是先在 ENV['DATABASE_URL'] 中搜索配置,然后在 config/database.yml 中搜索。因此,如果您只是删除初始化程序,那也可以解决问题。

    【讨论】:

      【解决方案2】:

      如果您在使用 Rails 4.2 时仍然遇到此问题,请先尝试使用 spring stop 停止 spring。 Spring 重新启动时将接受新的 ENV 变量。

      【讨论】:

        【解决方案3】:

        我在 Rails 4.2 中也遇到过类似的问题。除了@mario-uher 关于停止春天的评论之外,还有一件事要记住。我一直在我的初始化程序中访问数据库配置,如下所示:

        Rails.application.configure do |app|
          app.config.database_configuration[Rails.env]
        end
        

        这样做会从database.yml返回设置。实际的合并魔法发生在 ActiveRecord 本身。所以合并的配置应该像这样访问:

        ActiveRecord::Base.configurations[Rails.env]
        

        【讨论】:

          猜你喜欢
          • 2013-02-20
          • 2017-06-21
          • 2014-11-14
          • 2015-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-16
          • 1970-01-01
          相关资源
          最近更新 更多