"""Database settings for the Python tools (training, evaluation, backfills). The service itself is ping-collector (rust/collector); it reads the same environment / `.env` file (rust/collector/src/config.rs). PostgreSQL only: POSTGRES_CONNECTION_STRING, or POSTGRES_HOST / POSTGRES_PORT / POSTGRES_DB / POSTGRES_USER / POSTGRES_PASSWORD with the same defaults as ping-collector. """ import os import urllib.parse from typing import Optional try: from dotenv import load_dotenv load_dotenv() except ImportError: # the systemd units pass the variables in directly pass def database_url() -> Optional[str]: """The PostgreSQL connection string, or None when none is configured.""" url = os.getenv("POSTGRES_CONNECTION_STRING", "").strip() if url: return url password = os.getenv("POSTGRES_PASSWORD") if not password: return None user = urllib.parse.quote(os.getenv("POSTGRES_USER", "postgres"), safe="") host = os.getenv("POSTGRES_HOST", "localhost") port = os.getenv("POSTGRES_PORT", "5432") name = os.getenv("POSTGRES_DB", "water_monitoring") return ( f"postgresql://{user}:{urllib.parse.quote(password, safe='')}" f"@{host}:{port}/{name}" ) if __name__ == "__main__": url = database_url() if url and "@" in url: url = url.split("://", 1)[0] + "://***@" + url.rsplit("@", 1)[1] print(url or "no database configured")