SIT/database/models.py

158 lines
5.9 KiB
Python
Raw Permalink Normal View History

2026-01-29 09:22:54 +00:00
"""
数据库模型定义
使用SQLAlchemy ORM可选
"""
from sqlalchemy import (
Column, Integer, String, Float, DateTime, ForeignKey, Table, Text
)
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from datetime import datetime
Base = declarative_base()
class FieldModel(Base):
"""字段数据库模型"""
__tablename__ = 'fields'
id = Column(Integer, primary_key=True, autoincrement=True)
full_name = Column(String(255), unique=True, nullable=False)
domain = Column(String(100), nullable=False, index=True)
sub_domains = Column(String(255))
name = Column(String(100), nullable=False, index=True)
type = Column(String(50), nullable=False, index=True)
range_min = Column(String(100))
range_max = Column(String(100))
default_value = Column(String(255))
unit = Column(String(50))
description = Column(Text)
created_time = Column(DateTime, default=datetime.now)
updated_time = Column(DateTime, default=datetime.now, onupdate=datetime.now)
# 关系
messages = relationship('MessageFieldAssociation', back_populates='field')
def __repr__(self):
return f"<FieldModel(id={self.id}, full_name='{self.full_name}')>"
class MessageModel(Base):
"""消息数据库模型"""
__tablename__ = 'messages'
id = Column(Integer, primary_key=True, autoincrement=True)
full_name = Column(String(255), unique=True, nullable=False)
system_name = Column(String(100), nullable=False, index=True)
message_type = Column(String(100), nullable=False, index=True)
version = Column(String(50), nullable=False, index=True)
description = Column(Text)
protocol = Column(String(50), nullable=False)
serialization = Column(String(50), nullable=False)
created_time = Column(DateTime, default=datetime.now)
updated_time = Column(DateTime, default=datetime.now, onupdate=datetime.now)
# 关系
fields = relationship('MessageFieldAssociation', back_populates='message')
def __repr__(self):
return f"<MessageModel(id={self.id}, full_name='{self.full_name}')>"
class MessageFieldAssociation(Base):
"""消息-字段关联表"""
__tablename__ = 'message_fields'
id = Column(Integer, primary_key=True, autoincrement=True)
message_id = Column(Integer, ForeignKey('messages.id', ondelete='CASCADE'), nullable=False)
field_id = Column(Integer, ForeignKey('fields.id', ondelete='CASCADE'), nullable=False)
field_order = Column(Integer, nullable=False)
# 关系
message = relationship('MessageModel', back_populates='fields')
field = relationship('FieldModel', back_populates='messages')
def __repr__(self):
return f"<MessageFieldAssociation(message_id={self.message_id}, field_id={self.field_id})>"
class MappingModel(Base):
"""映射模型数据库模型"""
__tablename__ = 'mapping_models'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(255), unique=True, nullable=False)
mapping_type = Column(String(50), nullable=False, index=True)
source_field_ids = Column(Text, nullable=False) # JSON格式存储
target_field_id = Column(Integer, ForeignKey('fields.id', ondelete='CASCADE'), nullable=False)
operator = Column(String(50))
operand = Column(String(255))
language = Column(String(50))
code = Column(Text)
description = Column(Text)
created_time = Column(DateTime, default=datetime.now)
updated_time = Column(DateTime, default=datetime.now, onupdate=datetime.now)
def __repr__(self):
return f"<MappingModel(id={self.id}, name='{self.name}')>"
class GraphNodeModel(Base):
"""映射图节点模型"""
__tablename__ = 'mapping_graph_nodes'
id = Column(Integer, primary_key=True, autoincrement=True)
field_id = Column(Integer, ForeignKey('fields.id', ondelete='CASCADE'), unique=True, nullable=False)
x_position = Column(Float, default=0.0)
y_position = Column(Float, default=0.0)
def __repr__(self):
return f"<GraphNodeModel(id={self.id}, field_id={self.field_id})>"
class GraphEdgeModel(Base):
"""映射图边模型"""
__tablename__ = 'mapping_graph_edges'
id = Column(Integer, primary_key=True, autoincrement=True)
source_field_id = Column(Integer, ForeignKey('fields.id', ondelete='CASCADE'), nullable=False)
target_field_id = Column(Integer, ForeignKey('fields.id', ondelete='CASCADE'), nullable=False)
mapping_id = Column(Integer, ForeignKey('mapping_models.id', ondelete='CASCADE'), nullable=False)
weight = Column(Float, default=1.0)
def __repr__(self):
return f"<GraphEdgeModel(id={self.id}, {self.source_field_id}->{self.target_field_id})>"
class CompositeMappingModel(Base):
"""复合映射模型"""
__tablename__ = 'composite_mappings'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(255), unique=True, nullable=False)
description = Column(Text)
created_time = Column(DateTime, default=datetime.now)
updated_time = Column(DateTime, default=datetime.now, onupdate=datetime.now)
# 关系
items = relationship('CompositeMappingItemModel', back_populates='composite')
def __repr__(self):
return f"<CompositeMappingModel(id={self.id}, name='{self.name}')>"
class CompositeMappingItemModel(Base):
"""复合映射项模型"""
__tablename__ = 'composite_mapping_items'
id = Column(Integer, primary_key=True, autoincrement=True)
composite_id = Column(Integer, ForeignKey('composite_mappings.id', ondelete='CASCADE'), nullable=False)
mapping_id = Column(Integer, ForeignKey('mapping_models.id', ondelete='CASCADE'), nullable=False)
item_order = Column(Integer, nullable=False)
# 关系
composite = relationship('CompositeMappingModel', back_populates='items')
def __repr__(self):
return f"<CompositeMappingItemModel(composite_id={self.composite_id}, mapping_id={self.mapping_id})>"