# -*- coding: utf-8 -*- # # @author: lyg # @date: 2025-5-12 # @version: 1 # @description: 文档数据库模型 from sqlalchemy import create_engine, Column, DateTime, Integer, Text, ForeignKey from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship from sqlalchemy.orm import sessionmaker, scoped_session from knowledgebase.log import Log Base = declarative_base() metadata = Base.metadata class TParagraph(Base): """ 段落表 """ __tablename__ = 't_paragraphs' id = Column(Integer, primary_key=True) text = Column(Text) title_level = Column(Integer) title_num = Column(Text) num_level = Column(Integer) num = Column(Integer) doc_id = Column(Integer, ForeignKey('t_docs.id')) parent_id = Column(Integer, ForeignKey('t_paragraphs.id')) parent_link = relationship("TParagraphLink", foreign_keys='TParagraphLink.child_id', back_populates='parent', uselist=False) children_links = relationship("TParagraphLink", foreign_keys='TParagraphLink.parent_id', back_populates='child') ref_links = relationship("TParagraphRefLink", foreign_keys='TParagraphRefLink.child_id', back_populates='parent') entity_links = relationship("TParagraphEntityLink") is_del = Column(Integer) @property def children(self): return [link.child for link in self.children_links] @property def parent(self): if self.parent_link: return self.parent_link.parent return None def refs(self): return [link.child for link in self.ref_links] class TParagraphLink(Base): """ 段落link表 """ __tablename__ = 't_paragraph_links' id = Column(Integer, primary_key=True) parent_id = Column(Integer, ForeignKey('t_paragraphs.id')) parent = relationship("TParagraph", foreign_keys=[parent_id], back_populates="children_links") child_id = Column(Integer, ForeignKey('t_paragraphs.id')) child = relationship("TParagraph", foreign_keys=[child_id], back_populates="parent_link") is_del = Column(Integer) class TParagraphRefLink(Base): """ 段落引用link表 """ __tablename__ = 't_paragraph_ref_links' id = Column(Integer, primary_key=True) parent_id = Column(Integer, ForeignKey('t_paragraphs.id')) parent = relationship("TParagraph", foreign_keys=[parent_id], back_populates="ref_links") child_id = Column(Integer, ForeignKey('t_paragraphs.id')) child = relationship("TParagraph", foreign_keys=[child_id], viewonly=True) is_del = Column(Integer) class TParagraphEntityLink(Base): """ 段落实体link表 """ __tablename__ = 't_paragraph_entity_links' id = Column(Integer, primary_key=True) paragraph_id = Column(Integer, ForeignKey('t_paragraphs.id')) paragraph = relationship("TParagraph", foreign_keys=[paragraph_id], back_populates="entity_links") entity_id = Column(Integer, ForeignKey('t_entities.id')) entity = relationship("TEntity", foreign_keys=[entity_id]) is_del = Column(Integer) class TDoc(Base): """ 文档表 """ __tablename__ = 't_docs' id = Column(Integer, primary_key=True) file = Column(Text) file_name = Column(Text) paragraphs = relationship("TParagraph") is_del = Column(Integer) class TEntity(Base): """ 实体表 """ __tablename__ = 't_entities' id = Column(Integer, primary_key=True) name = Column(Text) prompts = Column(Text) type = Column(Text) doc_type = Column(Text) class TEntityLink(Base): __tablename__ = 't_entity_links' id = Column(Integer, primary_key=True) entity_id = Column(Integer, ForeignKey('t_entities.id')) is_del = Column(Integer) def init_doc_db(): """ 初始化文档数据库 :return: 数据库session实例 """ # mysql Log.info("连接并初始化文档数据库...") engine = create_engine('mysql+pymysql://root:123456@192.168.3.145:3306/knowledgebase', echo=False) Base.metadata.create_all(engine) SessionFactory = sessionmaker(bind=engine) Session = scoped_session(SessionFactory) session = Session() return session