# Standard library imports import os import sys # PyQt imports # Third party imports from alchemical import Alchemical # type:ignore # App imports from config import Config class DatabaseManager: """ Singleton class to ensure we only ever have one db object """ __instance = None def __init__(self, database_url: str, **kwargs: dict) -> None: if DatabaseManager.__instance is None: self.db = Alchemical(database_url, **kwargs) # Database managed by Alembic so no create_all() required # self.db.create_all() DatabaseManager.__instance = self else: raise Exception("Attempted to create a second DatabaseManager instance") @staticmethod def get_instance(database_url: str, **kwargs: dict) -> Alchemical: if DatabaseManager.__instance is None: DatabaseManager(database_url, **kwargs) return DatabaseManager.__instance # Establish database connection DATABASE_URL = os.environ.get("DATABASE_URL") if DATABASE_URL is None: raise ValueError("DATABASE_URL is undefined") if "unittest" in sys.modules and "sqlite" not in DATABASE_URL: raise ValueError("Unit tests running on non-Sqlite database") db = DatabaseManager.get_instance(DATABASE_URL, engine_options=Config.ENGINE_OPTIONS).db