Source code for fmn.database.setup

# SPDX-FileCopyrightText: Contributors to the Fedora Project
#
# SPDX-License-Identifier: MIT

import sys
from pathlib import Path

import alembic.command
import alembic.config
from sqlalchemy import inspect
from sqlalchemy.engine import Engine
from sqlalchemy.orm import Session

from ..core.config import get_settings

# Import the DB model here so its classes are considered by metadata.create_all() below.
from . import model  # noqa: F401
from .main import get_sync_engine, metadata

HERE = Path(__file__).parent


[docs]def setup_db_schema(engine_or_session: Engine | Session | None = None) -> None: if isinstance(engine_or_session, Session): engine = engine_or_session.get_bind() else: engine = engine_or_session or get_sync_engine() inspection_result = inspect(engine) present_tables = sorted(n for n in metadata.tables if inspection_result.has_table(n)) if present_tables: print(f"Tables already present: {', '.join(present_tables)}", file=sys.stderr) print("Refusing to change database schema.", file=sys.stderr) sys.exit(1) with engine.begin(): print("Creating database schema") metadata.create_all(bind=engine) print("Setting up database migrations") cfg = alembic.config.Config() cfg.set_main_option("script_location", str(HERE / "migrations")) cfg.set_main_option("sqlalchemy.url", get_settings().database.sqlalchemy.url) alembic.command.stamp(cfg, "head")