import os from urllib.parse import urlparse from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker from app.core.base import Base # Determine DATABASE_URL with sensible defaults for local testing DATABASE_URL = os.getenv("DATABASE_URL") if not DATABASE_URL: mariadb_host = os.getenv("MARIADB_HOST") mariadb_port = os.getenv("MARIADB_PORT", "3306") mariadb_db = os.getenv("MARIADB_DB") mariadb_user = os.getenv("MARIADB_USER") mariadb_password = os.getenv("MARIADB_PASSWORD") if mariadb_host and mariadb_db and mariadb_user and mariadb_password: DATABASE_URL = f"mysql+asyncmy://{mariadb_user}:{mariadb_password}@{mariadb_host}:{mariadb_port}/{mariadb_db}" else: # Default to local SQLite for tests/development when nothing is configured DATABASE_URL = os.getenv("SQLITE_URL", "sqlite+aiosqlite:///./test.db") # Load all models to register them from app.models.user import User from app.models.transaction import Transaction from app.models.categories import Category # Configure connect args based on backend parsed = urlparse(DATABASE_URL) scheme = parsed.scheme connect_args = {} if scheme.startswith("mysql"): host_env = os.getenv("MARIADB_HOST", parsed.hostname or "localhost") ssl_enabled = host_env not in {"localhost", "127.0.0.1"} connect_args = {"ssl": {"ssl": True}} if ssl_enabled else {} engine = create_async_engine( DATABASE_URL, pool_pre_ping=True, echo=os.getenv("SQL_ECHO", "0") == "1", connect_args=connect_args, ) async_session_maker = async_sessionmaker(engine, expire_on_commit=False)