Improve Settings class with robust DB path handling

- Replace DB_DIR class variable with proper DB_PATH string field
- Add initialization logic to safely create database directory
- Add fallback to in-memory database if directory creation fails
- Make database path configurable via environment variable
- Fix docstring linting issues
This commit is contained in:
Automated Action 2025-06-10 15:04:58 +00:00
parent bff5c53372
commit 2b5397d2ea

View File

@ -1,12 +1,11 @@
"""Application configuration settings.""" """Application configuration settings."""
import os
from pathlib import Path from pathlib import Path
from typing import ClassVar
from pydantic_settings import BaseSettings from pydantic_settings import BaseSettings
# Create database directory # Use a safe default path for the database
DB_DIR = Path("/app") / "storage" / "db" DEFAULT_DB_PATH = Path(os.getenv("DB_PATH", "/app/storage/db"))
DB_DIR.mkdir(parents=True, exist_ok=True)
class Settings(BaseSettings): class Settings(BaseSettings):
@ -17,13 +16,31 @@ class Settings(BaseSettings):
API_V1_STR: str = "/api/v1" API_V1_STR: str = "/api/v1"
# Database # Database
DB_DIR: ClassVar[Path] = DB_DIR DB_PATH: str = str(DEFAULT_DB_PATH)
SQLALCHEMY_DATABASE_URL: str = f"sqlite:///{DB_DIR}/db.sqlite" SQLALCHEMY_DATABASE_URL: str = ""
model_config = { model_config = {
"case_sensitive": True, "case_sensitive": True,
"env_file": ".env", "env_file": ".env",
} }
def __init__(self, **kwargs):
"""Initialize settings and set up database directory and URL.
Creates the database directory if it doesn't exist and sets the
database URL accordingly. Falls back to an in-memory database if
directory creation fails.
"""
super().__init__(**kwargs)
# Create the DB directory if it doesn't exist
db_dir = Path(self.DB_PATH)
try:
db_dir.mkdir(parents=True, exist_ok=True)
self.SQLALCHEMY_DATABASE_URL = f"sqlite:///{db_dir}/db.sqlite"
except (OSError, PermissionError):
# Fallback to an in-memory database if we can't create the directory
self.SQLALCHEMY_DATABASE_URL = "sqlite://"
print("WARNING: Could not create database directory. Using in-memory SQLite database.")
settings = Settings() settings = Settings()