From 96d086b4ed6403388758bc559b738bf3481c0d8c Mon Sep 17 00:00:00 2001 From: "railway-app[bot]" <68434857+railway-app[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 06:39:36 +0000 Subject: [PATCH] fix: prioritize MYSQL* env vars over DATABASE_URL in _build_database_uri --- utils/mysql_db.py | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/utils/mysql_db.py b/utils/mysql_db.py index 9f72e4f..b2e18aa 100644 --- a/utils/mysql_db.py +++ b/utils/mysql_db.py @@ -21,18 +21,38 @@ DATABASE_URL = os.environ.get('DATABASE_URL') def _build_database_uri(): - """Build a SQLAlchemy database URI from Railway or local environment variables.""" + """Build a SQLAlchemy database URI from Railway or local environment variables. + + Priority: + 1. Individual Railway reference variables (MYSQLHOST, MYSQLPORT, MYSQLUSER, + MYSQLPASSWORD, MYSQLDATABASE) — most reliable when set via Railway reference vars. + 2. DATABASE_URL — used as a fallback if the individual variables are absent. + """ + mysql_host = os.environ.get('MYSQLHOST') + mysql_port = os.environ.get('MYSQLPORT') + mysql_user = os.environ.get('MYSQLUSER') + mysql_password = os.environ.get('MYSQLPASSWORD') # may be empty string — that is valid + mysql_database = os.environ.get('MYSQLDATABASE') + + if mysql_host and mysql_user and mysql_database: + db_port = mysql_port or '3306' + db_password = mysql_password if mysql_password is not None else '' + if db_password: + return f"mysql+pymysql://{mysql_user}:{db_password}@{mysql_host}:{db_port}/{mysql_database}" + return f"mysql+pymysql://{mysql_user}@{mysql_host}:{db_port}/{mysql_database}" + if DATABASE_URL: url = make_url(DATABASE_URL) if url.drivername == 'mysql': url = url.set(drivername='mysql+pymysql') return str(url) - db_host = os.environ.get('DB_HOST') or os.environ.get('MYSQLHOST', 'localhost') - db_port = os.environ.get('DB_PORT') or os.environ.get('MYSQLPORT', '3306') - db_user = os.environ.get('DB_USER') or os.environ.get('MYSQLUSER', 'root') - db_password = os.environ.get('DB_PASSWORD') or os.environ.get('MYSQLPASSWORD', '') - db_name = os.environ.get('DB_NAME') or os.environ.get('MYSQLDATABASE', 'deteksi_pmk') + # Last-resort local defaults + db_host = os.environ.get('DB_HOST', 'localhost') + db_port = os.environ.get('DB_PORT', '3306') + db_user = os.environ.get('DB_USER', 'root') + db_password = os.environ.get('DB_PASSWORD', '') + db_name = os.environ.get('DB_NAME', 'deteksi_pmk') if db_password: return f"mysql+pymysql://{db_user}:{db_password}@{db_host}:{db_port}/{db_name}"