# [DEF:backend.src.models.mapping:Module] # # @SEMANTICS: database, mapping, environment, migration, sqlalchemy, sqlite # @PURPOSE: Defines the database schema for environment metadata and database mappings using SQLAlchemy. # @LAYER: Domain # @RELATION: DEPENDS_ON -> sqlalchemy # # @INVARIANT: All primary keys are UUID strings. # @CONSTRAINT: source_env_id and target_env_id must be valid environment IDs. # [SECTION: IMPORTS] from sqlalchemy import Column, String, Boolean, DateTime, ForeignKey, Enum as SQLEnum from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.sql import func import uuid import enum # [/SECTION] Base = declarative_base() # [DEF:MigrationStatus:Class] # @PURPOSE: Enumeration of possible migration job statuses. class MigrationStatus(enum.Enum): PENDING = "PENDING" RUNNING = "RUNNING" COMPLETED = "COMPLETED" FAILED = "FAILED" AWAITING_MAPPING = "AWAITING_MAPPING" # [/DEF:MigrationStatus:Class] # [DEF:Environment:Class] # @PURPOSE: Represents a Superset instance environment. class Environment(Base): __tablename__ = "environments" id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4())) name = Column(String, nullable=False) url = Column(String, nullable=False) credentials_id = Column(String, nullable=False) # [/DEF:Environment:Class] # [DEF:DatabaseMapping:Class] # @PURPOSE: Represents a mapping between source and target databases. class DatabaseMapping(Base): __tablename__ = "database_mappings" id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4())) source_env_id = Column(String, ForeignKey("environments.id"), nullable=False) target_env_id = Column(String, ForeignKey("environments.id"), nullable=False) source_db_uuid = Column(String, nullable=False) target_db_uuid = Column(String, nullable=False) source_db_name = Column(String, nullable=False) target_db_name = Column(String, nullable=False) engine = Column(String, nullable=True) # [/DEF:DatabaseMapping:Class] # [DEF:MigrationJob:Class] # @PURPOSE: Represents a single migration execution job. class MigrationJob(Base): __tablename__ = "migration_jobs" id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4())) source_env_id = Column(String, ForeignKey("environments.id"), nullable=False) target_env_id = Column(String, ForeignKey("environments.id"), nullable=False) status = Column(SQLEnum(MigrationStatus), default=MigrationStatus.PENDING) replace_db = Column(Boolean, default=False) created_at = Column(DateTime(timezone=True), server_default=func.now()) # [/DEF:MigrationJob:Class] # [/DEF:backend.src.models.mapping:Module]