SmartRescue / app /DB_utils.py
maxenceLIOGIER's picture
Upload folder using huggingface_hub
86e2833 verified
from sqlalchemy import insert, MetaData, Table
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine, select
from typing import Any
import uuid
from sqlalchemy import Column, Integer, String, ForeignKey, DateTime
from sqlalchemy.ext.declarative import declarative_base
import uuid
from datetime import datetime
Base = declarative_base()
class Origin(Base):
__tablename__ = "origin"
id_origin = Column(
String, primary_key=True, index=True, default=lambda: str(uuid.uuid4())
)
origin = Column(String, nullable=True)
class Status(Base):
__tablename__ = "status"
id_status = Column(
String, primary_key=True, index=True, default=lambda: str(uuid.uuid4())
)
status = Column(String, nullable=True)
class Prompt(Base):
__tablename__ = "prompt"
id_prompt = Column(
String, primary_key=True, index=True, default=lambda: str(uuid.uuid4())
)
session_id = Column(String, nullable=False)
id_origin = Column(String, ForeignKey("origin.id_origin"), nullable=True)
prompt = Column(String, nullable=True)
response = Column(String, nullable=True)
timestamp = Column(DateTime, nullable=True, default=datetime.now)
class Log(Base):
__tablename__ = "log"
id_log = Column(
String, primary_key=True, index=True, default=lambda: str(uuid.uuid4())
)
timestamp = Column(String, nullable=False)
id_prompt = Column(String, ForeignKey("prompt.id_prompt"), nullable=False)
id_status = Column(String, ForeignKey("status.id_status"), nullable=False)
id_origin = Column(String, ForeignKey("origin.id_origin"), nullable=False)
class Database:
def __init__(self, db_path: str):
self.engine = create_engine(f"sqlite:///{db_path}")
self.Session = sessionmaker(bind=self.engine)
self.session = self.Session()
self.metadata = MetaData()
self.metadata.reflect(bind=self.engine) # Load all tables
def insert(self, table: str, data: dict[str, Any]) -> bool:
"""
Inserts a row into the specified table.
:param table: str.
:param data: Dictionary of column names and values.
:return: True if insertion is successful, otherwise False.
clés pour enregistrer dans la table prompt:
- session_id
- origin
- prompt
- response
clés pour enregistrer dans la table log :
- timestamp
- prompt
- status
"""
if not data:
erreur = "Error: No data provided for insertion."
return erreur, False
table_obj = self.metadata.tables.get(table)
if table_obj is None:
erreur = f"Error: Table '{table}' does not exist."
return erreur, False
try:
with self.Session() as session:
if table == "prompt":
statement = select(Origin).where(Origin.origin == data["origin"])
id_origin = session.scalar(statement=statement)
if not id_origin:
insert_origin = insert(Origin).values(
id_origin=str(uuid.uuid4()), origin=data["origin"]
)
session.execute(statement=insert_origin)
session.commit()
id_origin = session.scalar(statement=statement).id_origin
insert_prompt = insert(Prompt).values(
id_prompt=str(uuid.uuid4()),
session_id=data["session_id"],
id_origin=id_origin,
prompt=data["prompt"],
response=data["response"],
)
session.execute(insert_prompt)
session.commit()
return id_prompt, True
if table == "log":
statement = select(Status).where(Status.status == data["status"])
id_status = session.scalar(statement=statement)
if not id_status:
insert_status = insert(Status).values(
id_status=str(uuid.uuid4()), status=data["status"]
)
session.execute(insert_status)
session.commit()
id_status = session.scalar(statement).id_status
statement = select(Prompt).where(Prompt.prompt == data["prompt"])
prompt = session.scalar(statement)
if not prompt:
raise "Le prompt demandé n'existe pas."
id_prompt = prompt.id_prompt
id_origin = prompt.id_origin
insert_log = insert(Log).values(
id_log=str(uuid.uuid4()),
timestamp=data["timestamp"],
id_prompt=id_prompt,
id_status=id_status,
id_origin=id_origin,
)
session.execute(insert_log)
session.commit()
return id_status, True
except Exception as e:
erreur = f"Error inserting into table '{table}': {e}"
return erreur, False