Skip to content

Instantly share code, notes, and snippets.

@gullitmiranda
Last active October 10, 2023 08:07
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save gullitmiranda/62082f2e47c364ef9617 to your computer and use it in GitHub Desktop.
Save gullitmiranda/62082f2e47c364ef9617 to your computer and use it in GitHub Desktop.
ruby DATABASE_URL parse
<%
require 'cgi'
require 'uri'
begin
uri = URI.parse(ENV["DATABASE_URL"])
rescue URI::InvalidURIError
raise "Invalid DATABASE_URL"
end
env = ENV["RAILS_ENV"] || ENV["RACK_ENV"]
raise "No RACK_ENV or RAILS_ENV found" unless env
def attribute(name, value, force_string = false)
if value
value_string =
if force_string
'"' + value + '"'
else
value
end
"#{name}: #{value_string}"
else
""
end
end
database = "#{(uri.path || "").split("/")[1]}_#{env}"
username = uri.user
password = uri.password
host = uri.host
port = uri.port
params = CGI.parse(uri.query || "")
params["encoding"] = ["utf8"] unless params["encoding"].present?
params["pool" ] = [5] unless params["pool" ].present?
adapter = case uri.scheme.to_s
when "postgres" then "postgresql"
when "mysql" then "mysql2"
else uri.scheme.to_s
end
%>
<%= env %>:
<%= attribute "adapter", adapter %>
<%= attribute "database", database %>
<%= attribute "username", username %>
<%= attribute "password", password, true %>
<%= attribute "host", host %>
<%= attribute "port", port %>
<% params.each do |key, value| %>
<%= key %>: <%= value.first %>
<% end %>
@kaden-weber
Copy link

Useful, cheers!

@johnymachine
Copy link

johnymachine commented Oct 10, 2023

https://gist.github.com/gullitmiranda/62082f2e47c364ef9617#file-database-yml-L6 allows only URL safe chars reducing overall password complexity. If you generate random password, make sure to only include URL safe chars.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment