@@ -105,13 +105,32 @@ fn run(opts: Opts) -> anyhow::Result<()> {
105105}
106106
107107fn reshape_from_connection_options(opts: &ConnectionOptions) -> anyhow::Result<Reshape> {
108− let env_url = std::env::var("DB_URL").ok();
109− let url = env_url.as_ref().or_else(|| opts.url.as_ref());
108+ let url_env = std::env::var("DB_URL").ok();
109+ let url = url_env.as_ref().or_else(|| opts.url.as_ref());
110110
111− match url {
112− Some(url) => Reshape::new(url),
113− None => Reshape::new_with_options(&opts.host, opts.port, &opts.username, &opts.password),
111+ // Use the connection URL if it has been set
112+ if let Some(url) = url {
113+ return Reshape::new(url);
114114 }
115+
116+ let host_env = std::env::var("DB_HOST").ok();
117+ let host = host_env.as_ref().unwrap_or_else(|| &opts.host);
118+
119+ let port = std::env::var("DB_PORT")
120+ .ok()
121+ .and_then(|port| port.parse::<u16>().ok())
122+ .unwrap_or(opts.port);
123+
124+ let username_env = std::env::var("DB_USERNAME").ok();
125+ let username = username_env.as_ref().unwrap_or_else(|| &opts.username);
126+
127+ let password_env = std::env::var("DB_PASSWORD").ok();
128+ let password = password_env.as_ref().unwrap_or_else(|| &opts.password);
129+
130+ let database_env = std::env::var("DB_NAME").ok();
131+ let database = database_env.as_ref().unwrap_or_else(|| &opts.database);
132+
133+ Reshape::new_with_options(host, port, database, username, password)
115134}
116135
117136fn find_migrations(opts: &FindMigrationsOptions) -> anyhow::Result<Vec<Migration>> {