I\'m using Rails with Postgres DB Docker container attached. It looks like I\'m getting below error when I run rails c:
/usr/local/rvm/rubies/ruby-2
Rename your environment variable!
DATABASE_URL is reserved by Rails, and interpreted by ActiveRecord itself. I ran into the same issue.
Instead, use something like this:
host: <%= ENV['DB_HOST'] %>
password: <%= ENV['DB_PWD'] %>
From the "Configuring Rails Applications" guide, it would appear that DATABASE_URL is used for configuring database access. Another way to configure database access is the presence of the file config/database.yml. Trying to use both methods to configure database access causes the issue you are facing.
Connection string used for DATABASE_URL cannot contain special characters (anything other than [a-zA-Z0-9_~-\.], e.g. @ is a common one to mess up). Solution is to url-encode.
The accepted answer is wrong. There's nothing wrong with using DATABASE_URL in your database.yml, although doing so explicitly is probably redundant. The problem is with the value of the URL.
ActiveRecord uses URI::RFC2396_Parser to parse database URLs. The error message above indicates that it's not able to parse the URL, probably because the hostname is missing, cf.
URI::RFC2396_Parser.new.parse('postgres://postgres:@/mydb')
# Traceback (most recent call last):
# 1: from (irb):30
# URI::InvalidURIError (the scheme postgres does not accept registry part: postgres:@ (or bad hostname?))
Other invalid hostnames, such as hostnames with underscores (common in docker-compose setups) will cause similar errors:
URI::RFC2396_Parser.new.parse('postgres://postgres:postgres@my_postgres/mydb')
# Traceback (most recent call last):
# 1: from (irb):34
# URI::InvalidURIError (the scheme postgres does not accept registry part: postgres:postgres@my_postgres (or bad hostname?))
What can be especially confusing is that URI.parse() uses URI::RFC3986_Parser, which is much more forgiving, and will accept either of these "bad" URLs.