Небольшие изменения
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user