"""备份执行抽象基类:MySQL / Directory 都实现此接口。""" from abc import ABC, abstractmethod from dataclasses import dataclass from typing import AsyncIterator, Optional @dataclass class BackupMetadata: """备份产物的元信息。""" suggested_filename: str # e.g. "db-20260622-030000.sql.gz" 或 "logs-20260622.tar.gz" content_type: str = "application/octet-stream" extra: Optional[dict] = None class BaseBackup(ABC): """所有数据源类型实现此接口。 方法职责: - metadata(): 计算建议文件名等 - produce(): 以异步字节流形式产出备份内容 """ def __init__(self, source_config: dict, job_name: str): self.source_config = source_config self.job_name = job_name @abstractmethod def metadata(self) -> BackupMetadata: ... @abstractmethod async def produce(self) -> AsyncIterator[bytes]: """异步产出备份字节流。""" # 子类应使用 async with + async generator ... yield b"" # pragma: no cover