Небольшие изменения

This commit is contained in:
brusnitsyn
2026-03-13 17:11:39 +09:00
parent c201d36ae6
commit de2dd82fa1
18 changed files with 1140 additions and 491 deletions

View File

@@ -1,9 +1,9 @@
# app/models/replication.py
from typing import List, Optional
from sqlalchemy import JSON, Column, ForeignKey, String, DateTime, BigInteger, Integer, Boolean, Time
from sqlalchemy import JSON, Column, ForeignKey, Null, String, DateTime, BigInteger, Integer, Boolean, Time
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy.orm import relationship, Mapped, mapped_column
from datetime import datetime
Base = declarative_base()
@@ -13,17 +13,21 @@ class ReplicationMetadata(Base):
"""Модель для хранения метаданных репликации"""
__tablename__ = 'replication_metadata'
#__table_args__ = {"schema": "replicator"}
table_name = Column(String(100), primary_key=True, nullable=False)
last_sync_time = Column(DateTime, nullable=True)
last_id = Column(BigInteger, nullable=True)
total_rows = Column(BigInteger, default=0)
last_error = Column(String(500), nullable=True)
is_active = Column(Boolean, default=True)
created_at = Column(DateTime, default=datetime.now)
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
id: Mapped[int] = mapped_column(Integer, primary_key=True)
table_name: Mapped[str] = mapped_column(String(100), nullable=False)
life_table_name: Mapped[str] = mapped_column(String(100), nullable=True)
description: Mapped[str] = mapped_column(String(255), nullable=True)
last_sync_time: Mapped[datetime] = mapped_column(DateTime, nullable=True)
last_id: Mapped[int] = mapped_column(BigInteger, nullable=True)
total_rows: Mapped[int] = mapped_column(BigInteger, default=0)
last_error: Mapped[str] = mapped_column(String(500), nullable=True)
is_active: Mapped[bool] = mapped_column(Boolean, default=True)
created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.now)
updated_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.now, onupdate=datetime.now)
schedule = relationship("ReplicationSchedule", back_populates="table", cascade="all, delete-orphan")
schedule: Mapped["ReplicationSchedule"] = relationship("ReplicationSchedule", back_populates="table", cascade="all, delete-orphan")
def __repr__(self):
return f"<ReplicationMetadata(table='{self.table_name}')>"
@@ -61,26 +65,29 @@ class ReplicationMetadata(Base):
self.updated_at = datetime.now()
session.commit()
def has_use_life(self):
"""Разрешение использовать Life таблицу для миграции"""
return self.life_table_name is not None
class ReplicationSchedule(Base):
"""Модель для расписания миграции таблицы"""
__tablename__ = 'replication_schedules'
id = Column(Integer, primary_key=True, autoincrement=True)
table_name = Column(String(100), ForeignKey('replication_metadata.table_name', ondelete='CASCADE'), nullable=False)
schedule_time = Column(Time, nullable=False, default=datetime.strptime("00:00", "%H:%M").time())
days = Column(JSON, nullable=False, default=list) # Храним список дней как JSON
full_reload = Column(Boolean, default=False)
enabled = Column(Boolean, default=True)
last_run = Column(DateTime, nullable=True)
created_at = Column(DateTime, default=datetime.now)
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
metadata_id: Mapped[int] = mapped_column(Integer, ForeignKey('replication_metadata.id', ondelete='CASCADE'), nullable=False)
schedule_time: Mapped[datetime] = mapped_column(Time, nullable=False, default=datetime.strptime("00:00", "%H:%M").time())
days: Mapped[JSON] = mapped_column(JSON, nullable=False, default=list) # Храним список дней как JSON
full_reload: Mapped[bool] = mapped_column(Boolean, default=False)
enabled: Mapped[bool] = mapped_column(Boolean, default=True)
last_run: Mapped[datetime] = mapped_column(DateTime, nullable=True)
created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.now)
updated_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.now, onupdate=datetime.now)
name = Column(String(100), nullable=True)
description = Column(String(500), nullable=True)
name: Mapped[str] = mapped_column(String(100), nullable=True)
description: Mapped[str] = mapped_column(String(500), nullable=True)
# Связь с метаданными
table = relationship("ReplicationMetadata", back_populates="schedule")
table: Mapped[ReplicationMetadata] = relationship("ReplicationMetadata", back_populates="schedule")
# Маппинг дней для обратной совместимости
DAYS_MAP = {
@@ -137,7 +144,7 @@ class ReplicationSchedule(Base):
# Используем __dict__, но исключаем служебные поля SQLAlchemy
data = {
'id': self.id,
'table_name': self.table_name,
'metadata_id': self.metadata_id,
'schedule_time': self.schedule_time.strftime("%H:%M") if self.schedule_time else "00:00",
'days': self.days, # Сохраняем как есть, а days_display вычислим отдельно
'full_reload': self.full_reload,
@@ -146,7 +153,8 @@ class ReplicationSchedule(Base):
'name': self.name,
'description': self.description,
'created_at': self.created_at.isoformat() if self.created_at else None,
'updated_at': self.updated_at.isoformat() if self.updated_at else None
'updated_at': self.updated_at.isoformat() if self.updated_at else None,
'table': self.table
}
# Вычисляем days_display на основе days