158 lines
5.9 KiB
Python
158 lines
5.9 KiB
Python
|
|
"""
|
|||
|
|
数据库模型定义
|
|||
|
|
使用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})>"
|