from functools import lru_cache

from sqlalchemy import create_engine
from sqlalchemy.orm import DeclarativeBase, sessionmaker

from flyway.config import settings


class Base(DeclarativeBase):
    pass


@lru_cache
def get_engine(url: str | None = None):
    return create_engine(url or settings.database_url)


def get_session_factory(url: str | None = None):
    return sessionmaker(get_engine(url), expire_on_commit=False)
