"""Run the migrations in the app, rather than with yoyo CLI.""" from pathlib import Path from typing import Union from yoyo import read_migrations from yoyo.backends import DatabaseBackend from yoyo.migrations import Migration, MigrationList class MigrationNotFound(Exception): """Raised if a migration is not found at the given path.""" def __init__(self, migration_path: Path): """Initialise the exception.""" super().__init__(f"Could not find migration '{migration_path}'") def apply_migrations(backend: DatabaseBackend, migrations: MigrationList): "Apply the provided migrations." with backend.lock(): backend.apply_migrations(backend.to_apply(migrations)) def rollback_migrations(backend: DatabaseBackend, migrations: MigrationList): "Rollback the provided migrations." with backend.lock(): backend.rollback_migrations(backend.to_rollback(migrations)) def get_migration(migration_path: Union[Path, str]) -> Migration: """Retrieve a migration at thi given `migration_path`.""" migration_path = Path(migration_path) if migration_path.exists(): for migration in read_migrations(str(migration_path.parent)): if Path(migration.path) == migration_path: return migration raise MigrationNotFound(migration_path)