44 lines
1.3 KiB
Python
44 lines
1.3 KiB
Python
# 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
|