Rails не считает `DATABASE_URL` в среде` test`? - PullRequest
1 голос
/ 11 октября 2019

Я использую docker-compose для создания двух сервисов для моего приложения на Rails:

  • web - собственно Rails / веб-приложение
  • db - A postgresконтейнер, работающий с postgres 11.5

Я использую обе службы локально с RAILS_ENV=development.

В качестве однократного ручного шага я хочу: Самый первый раз, когда я пытаюсь запустить rake db:create для создания базы данных. Тем не менее, я получаю сообщение об ошибке postgres:

docker-compose up --build --no-start
docker-compose run --rm web bundle exec rake db:create

RAILS_ENV=development bundle exec rake db:create
Created database 'feeder_development'
could not connect to server: Connection refused
  Is the server running on host "localhost" (127.0.0.1) and accepting
  TCP/IP connections on port 5432?
could not connect to server: Cannot assign requested address
  Is the server running on host "localhost" (::1) and accepting
  TCP/IP connections on port 5432?
Couldn't create 'feeder_test' database. Please check your configuration.
rake aborted!
PG::ConnectionBad: could not connect to server: Connection refused
  Is the server running on host "localhost" (127.0.0.1) and accepting
  TCP/IP connections on port 5432?
could not connect to server: Cannot assign requested address
  Is the server running on host "localhost" (::1) and accepting
  TCP/IP connections on port 5432?
/app/vendor/bundle/ruby/2.5.0/gems/pg-0.18.4/lib/pg.rb:45:in `initialize'
/app/vendor/bundle/ruby/2.5.0/gems/pg-0.18.4/lib/pg.rb:45:in `new'
/app/vendor/bundle/ruby/2.5.0/gems/pg-0.18.4/lib/pg.rb:45:in `connect'
/app/vendor/bundle/ruby/2.5.0/gems/activerecord-5.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:692:in `connect'
/app/vendor/bundle/ruby/2.5.0/gems/activerecord-5.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:223:in `initialize'
/app/vendor/bundle/ruby/2.5.0/gems/activerecord-5.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:48:in `new'
/app/vendor/bundle/ruby/2.5.0/gems/activerecord-5.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:48:in `postgresql_connection'
/app/vendor/bundle/ruby/2.5.0/gems/activerecord-5.2.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:811:in `new_connection'

Как вы можете видеть, он успешно создал базу данных development, но не удалось при создании test база данных

(задачи db:create автоматически создают базы данных test и development вместе, даже когда среда development)

Вот мой database.yml.

default: &default
  adapter: postgresql
  encoding: utf8
  host: localhost
  min_messages: warning
  pool: 5
  timeout: 5000

test:
  <<: *default
  database: feeder_test

development:
  <<: *default
  database: feeder_development

Согласно руководствам Rails , вы можете переопределить вышеуказанный конфиг, указав DATABASE_URL, который я установил как:

DATABASE_URL=postgres://feeder:password123@db/

что я могу сказать -

  1. Rails объединяет информацию DATABASE_URL с информацией database.yml при попытке создать базу данных development. Все хорошо.

  2. Rails НЕ учитывает DATABASE_URL при создании базы данных test. Он использует ТОЛЬКО информацию database.yml, поэтому ищет соединение psql на localhost.

Так что - есть ли способ заставить Rails уважать мою DATABASE_URLENV в среде test?

Ответы [ 2 ]

1 голос
/ 11 октября 2019

в вашем database.yml установите url на ENV['DATABASE_URL'] и оставьте другие ключи по умолчанию:

test:
  url: <%= ENV['DATABASE_URL'] %>
  database: app_test
  host: 127.0.0.1
DATABASE_URL='postgresql://192.168.0.2/' rails runner 'puts ActiveRecord::Base.configurations.to_json' | jq '.test'
{
  "database": "app_test",
  "host": "192.168.0.2",
  "adapter": "postgresql"
}

Обратите внимание, что имя базы данных осталось без изменений, но хост был перезаписан.

1 голос
/ 11 октября 2019

Я уверен, что вы можете поместить ERB в файл database.yml, поэтому я бы предложил изменить test на

test:
  <<: *default
  database: <%= ENV['DATABASE_URL'] || 'feeder_test' %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...