Spaces:
Running
Running
from sqlalchemy import create_engine, Column, String, Text, ForeignKey, DateTime | |
from sqlalchemy.orm import sessionmaker, declarative_base, relationship | |
from datetime import datetime | |
# Database Configuration | |
DATABASE_URL = "sqlite:///./chats.db" | |
engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False}) | |
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) | |
Base = declarative_base() | |
class User(Base): | |
__tablename__ = "users" | |
id = Column(String, primary_key=True, unique=True, nullable=False) | |
email = Column(String, unique=True, nullable=False) | |
name = Column(String, nullable=False) | |
chats = relationship("Chat", back_populates="user", cascade="all, delete-orphan") | |
class Chat(Base): | |
__tablename__ = "chats" | |
chat_id = Column(String, primary_key=True, unique=True, nullable=False) | |
user_id = Column(String, ForeignKey("users.id", ondelete="CASCADE"), nullable=False) | |
title = Column(String, nullable=False) | |
timestamp = Column(DateTime, default=datetime.utcnow, nullable=False) | |
messages = relationship("ChatMessage", back_populates="chat", cascade="all, delete-orphan") | |
documents = relationship("Document", back_populates="chat", cascade="all, delete-orphan") | |
user = relationship("User", back_populates="chats") | |
class ChatMessage(Base): | |
__tablename__ = "chat_messages" | |
id = Column(String, primary_key=True, unique=True, nullable=False) | |
chat_id = Column(String, ForeignKey("chats.chat_id", ondelete="CASCADE"), nullable=False) | |
type = Column(String, nullable=False) # 'user' or 'assistant' | |
content = Column(Text, nullable=False) | |
timestamp = Column(DateTime, default=datetime.utcnow, nullable=False) | |
referenced_docs = Column(Text, nullable=True) # JSON string of referenced documents | |
chat = relationship("Chat", back_populates="messages") | |
class Document(Base): | |
__tablename__ = "documents" | |
id = Column(String, primary_key=True, unique=True, nullable=False) | |
chat_id = Column(String, ForeignKey("chats.chat_id", ondelete="CASCADE"), nullable=False) | |
name = Column(String, nullable=False) | |
content = Column(Text, nullable=False) | |
timestamp = Column(DateTime, default=datetime.utcnow, nullable=False) | |
chat = relationship("Chat", back_populates="documents") | |
Base.metadata.create_all(bind=engine) | |
def get_db(): | |
db = SessionLocal() | |
try: | |
yield db | |
finally: | |
db.close() | |