82 lines
2.4 KiB
Python
82 lines
2.4 KiB
Python
"""Configuration helpers for connecting to the MSSQL sandbox."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
from dataclasses import dataclass
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class DbSettings:
|
|
"""Environment-driven connection settings for SQL Server.
|
|
|
|
Required variables:
|
|
- DB_SERVER (e.g.,
|
|
- DB_DATABASE (e.g., "SugarScale_Lasuca")
|
|
- DB_USERNAME (database login)
|
|
- DB_PASSWORD (database password)
|
|
|
|
Optional overrides:
|
|
- DB_DRIVER (defaults to "$env")
|
|
- DB_ENCRYPT ("true" to enable TLS)
|
|
- DB_TRUST_CERT ("true" to trust the server certificate)
|
|
"""
|
|
|
|
server: str
|
|
database: str
|
|
username: str
|
|
password: str
|
|
driver: str = "ODBC Driver 18 for SQL Server"
|
|
encrypt: bool = True
|
|
trust_server_certificate: bool = True
|
|
|
|
@classmethod
|
|
def from_env(cls) -> "DbSettings":
|
|
missing: list[str] = []
|
|
server = os.getenv("DB_SERVER")
|
|
if not server:
|
|
missing.append("DB_SERVER")
|
|
database = os.getenv("DB_DATABASE")
|
|
if not database:
|
|
missing.append("DB_DATABASE")
|
|
username = os.getenv("DB_USERNAME")
|
|
if not username:
|
|
missing.append("DB_USERNAME")
|
|
password = os.getenv("DB_PASSWORD")
|
|
if not password:
|
|
missing.append("DB_PASSWORD")
|
|
|
|
if missing:
|
|
raise RuntimeError(
|
|
"Missing required environment variables: " + ", ".join(missing)
|
|
)
|
|
|
|
driver = os.getenv("DB_DRIVER", "ODBC Driver 18 for SQL Server")
|
|
encrypt = os.getenv("DB_ENCRYPT", "true").lower() == "true"
|
|
trust = os.getenv("DB_TRUST_CERT", "true").lower() == "true"
|
|
|
|
return cls(
|
|
server=server,
|
|
database=database,
|
|
username=username,
|
|
password=password,
|
|
driver=driver,
|
|
encrypt=encrypt,
|
|
trust_server_certificate=trust,
|
|
)
|
|
|
|
def connection_string(self) -> str:
|
|
parts = [
|
|
f"DRIVER={{{self.driver}}}",
|
|
f"SERVER={self.server}",
|
|
f"DATABASE={self.database}",
|
|
f"UID={self.username}",
|
|
f"PWD={self.password}",
|
|
]
|
|
if self.encrypt:
|
|
parts.append("Encrypt=yes")
|
|
if self.trust_server_certificate:
|
|
parts.append("TrustServerCertificate=yes")
|
|
parts.append("MARS_Connection=yes")
|
|
return ";".join(parts)
|