from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from pathlib import Path import os # Try to get database path from environment variable DB_PATH = os.environ.get("DATABASE_PATH") if DB_PATH: # Use the provided path SQLALCHEMY_DATABASE_URL = f"sqlite:///{DB_PATH}" else: # Default paths with fallbacks for different environments possible_paths = [ Path("/app/storage/db/db.sqlite"), # Docker container standard path Path("/tmp/hrplatform/db/db.sqlite"), # Fallback to tmp directory Path.cwd() / "db" / "db.sqlite" # Local development in current directory ] # Find the first parent directory that is writable for path in possible_paths: try: # Ensure directory exists path.parent.mkdir(parents=True, exist_ok=True) # Test if we can write to this directory test_file = path.parent / ".write_test" test_file.touch() test_file.unlink() SQLALCHEMY_DATABASE_URL = f"sqlite:///{path}" print(f"Using database at: {path}") break except (PermissionError, OSError): continue else: # If we get here, none of the paths worked raise RuntimeError( "Could not find a writable location for the database. " "Please set the DATABASE_PATH environment variable." ) # Create the engine with the configured URL engine = create_engine( SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False} ) SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) def get_db(): db = SessionLocal() try: yield db finally: db.close()