Spaces:
Runtime error
Runtime error
| import streamlit as st | |
| import psycopg2 | |
| import sqlite3 | |
| from sqlite3 import Connection | |
| from datetime import datetime | |
| import logging | |
| from typing import List, Dict | |
| import pandas as pd | |
| # Configuration du logging | |
| logging.basicConfig(level=logging.INFO, handlers=[logging.StreamHandler()]) | |
| logger = logging.getLogger(__name__) | |
| # Fonction pour obtenir la connexion à la base de données | |
| # def get_db_connection(): | |
| # try: | |
| # conn = psycopg2.connect( | |
| # host=st.secrets["DB_HOST"], | |
| # port=st.secrets["DB_PORT"], | |
| # dbname=st.secrets["DB_NAME"], | |
| # user=st.secrets["DB_USER"], | |
| # password=st.secrets["DB_PASSWORD"] | |
| # ) | |
| # return conn | |
| # except Exception as e: | |
| # logger.error(f"Erreur de connexion à la base de données: {e}") | |
| # return None | |
| def get_db_connection() -> Connection: | |
| """ | |
| Établit une connexion avec la base SQLite. | |
| Returns: | |
| Connection : le client de connexion à la base. | |
| """ | |
| try: | |
| conn = sqlite3.connect( | |
| st.secrets["DB_NAME"], check_same_thread=False | |
| ) # Spécifiez ici le chemin de votre fichier SQLite | |
| conn.row_factory = sqlite3.Row # Pour des résultats sous forme de dictionnaire | |
| return conn | |
| except sqlite3.Error as e: | |
| logger.error(f"Erreur de connexion à la base de données SQLite: {e}") | |
| return None | |
| # Connexion à la base de données pour récupérer le nombre total de recettes | |
| # def get_recipes_count(): | |
| # conn = get_db_connection() | |
| # if conn is None: | |
| # return 0 | |
| # try: | |
| # cursor = conn.cursor() | |
| # cursor.execute("SELECT COUNT(*) FROM suggestions_repas") | |
| # result = cursor.fetchone() | |
| # return result[0] # Le nombre total de recettes | |
| # except Exception as e: | |
| # logger.error(f"Erreur lors de la récupération du nombre de recettes : {e}") | |
| # return 0 | |
| # finally: | |
| # cursor.close() | |
| # conn.close() | |
| def get_recipes_count() -> int: | |
| """ | |
| Récupère le nombre total de recettes enregistrées dans la table `suggestions_repas` de la base de données SQLite. | |
| Cette fonction se connecte à la base de données SQLite, exécute une requête pour compter le nombre d'entrées | |
| dans la table `suggestions_repas`, puis retourne ce nombre. | |
| Returns: | |
| int: Le nombre total de recettes dans la table `suggestions_repas`. Retourne 0 en cas d'erreur ou si la connexion échoue. | |
| """ | |
| # Connexion à la base de données SQLite | |
| conn = get_db_connection() | |
| # Si la connexion échoue, on retourne 0 | |
| if conn is None: | |
| return 0 | |
| try: | |
| # Création du curseur pour exécuter la requête | |
| cursor = conn.cursor() | |
| # Exécution de la requête SQL pour compter les entrées de recettes dans la table 'suggestions_repas' | |
| cursor.execute("SELECT COUNT(*) FROM suggestions_repas") | |
| # Récupération du résultat de la requête | |
| result = cursor.fetchone() | |
| # Retour du nombre total de recettes | |
| return result[0] # Le nombre total de recettes | |
| except sqlite3.Error as e: | |
| # En cas d'erreur, on enregistre l'erreur dans les logs et on retourne 0 | |
| logger.error(f"Erreur lors de la récupération du nombre de recettes : {e}") | |
| return 0 | |
| finally: | |
| # Fermeture du curseur et de la connexion | |
| cursor.close() | |
| conn.close() | |
| # Fonction pour récupérer la latence moyenne des messages | |
| # def get_average_latency(): | |
| # conn = get_db_connection() | |
| # if conn is None: | |
| # return 0.0 | |
| # try: | |
| # cursor = conn.cursor() | |
| # cursor.execute("SELECT AVG(temps_traitement) FROM messages WHERE temps_traitement IS NOT NULL") | |
| # result = cursor.fetchone() | |
| # return round(result[0], 2) if result[0] is not None else 0.0 | |
| # except Exception as e: | |
| # logger.error(f"Erreur de connexion à la base de données pour la latence : {e}") | |
| # return 0.0 | |
| # finally: | |
| # cursor.close() | |
| # conn.close() | |
| def get_average_latency() -> float: | |
| """ | |
| Récupère la latence moyenne des traitements enregistrés dans la table `messages` de la base de données SQLite. | |
| Cette fonction se connecte à la base de données SQLite, exécute une requête pour calculer la moyenne des valeurs | |
| dans la colonne `temps_traitement` de la table `messages`, et retourne cette moyenne avec une précision de deux décimales. | |
| Returns: | |
| float: La latence moyenne des traitements en secondes. Retourne 0.0 en cas d'erreur ou si aucune donnée valide n'est disponible. | |
| """ | |
| # Connexion à la base de données SQLite | |
| conn = get_db_connection() | |
| # Si la connexion échoue, on retourne 0.0 | |
| if conn is None: | |
| return 0.0 | |
| try: | |
| # Création du curseur pour exécuter la requête | |
| cursor = conn.cursor() | |
| # Exécution de la requête SQL pour calculer la moyenne de la colonne 'temps_traitement' | |
| cursor.execute( | |
| "SELECT AVG(temps_traitement) FROM messages WHERE temps_traitement IS NOT NULL" | |
| ) | |
| # Récupération du résultat de la requête | |
| result = cursor.fetchone() | |
| # Retour de la moyenne arrondie à 2 décimales, ou 0.0 si aucun résultat | |
| return round(result[0], 2) if result[0] is not None else 0.0 | |
| except sqlite3.Error as e: | |
| # En cas d'erreur, on enregistre l'erreur dans les logs et on retourne 0.0 | |
| logger.error(f"Erreur de connexion à la base de données pour la latence : {e}") | |
| return 0.0 | |
| finally: | |
| # Fermeture du curseur et de la connexion | |
| cursor.close() | |
| conn.close() | |
| # Fonction pour récupérer le nombre de requêtes par jour | |
| # def get_daily_requests(): | |
| # conn = get_db_connection() | |
| # if conn is None: | |
| # return pd.DataFrame() | |
| # try: | |
| # query = """ | |
| # SELECT | |
| # DATE(timestamp) AS date, | |
| # COUNT(*) AS nombre_requetes | |
| # FROM | |
| # messages | |
| # GROUP BY | |
| # date | |
| # ORDER BY | |
| # date; | |
| # """ | |
| # df = pd.read_sql(query, conn) | |
| # return df | |
| # except Exception as e: | |
| # logger.error(f"Erreur lors de la récupération des requêtes par jour : {e}") | |
| # return pd.DataFrame() | |
| # finally: | |
| # conn.close() | |
| def get_daily_requests() -> pd.DataFrame: | |
| """ | |
| Récupère les requêtes quotidiennes à partir de la table `messages` de la base de données SQLite. | |
| Cette fonction se connecte à la base de données SQLite, exécute une requête SQL pour compter le nombre de requêtes | |
| (messages) par jour, et retourne les résultats sous forme de DataFrame pandas. | |
| Returns: | |
| pd.DataFrame: Un DataFrame contenant les dates et le nombre de requêtes pour chaque jour. | |
| Retourne un DataFrame vide en cas d'erreur. | |
| """ | |
| # Connexion à la base de données SQLite | |
| conn = get_db_connection() | |
| # Si la connexion échoue, retourner un DataFrame vide | |
| if conn is None: | |
| return pd.DataFrame() | |
| try: | |
| # Requête SQL pour récupérer le nombre de requêtes par jour | |
| query = """ | |
| SELECT | |
| DATE(timestamp) AS date, | |
| COUNT(*) AS nombre_requetes | |
| FROM | |
| messages | |
| GROUP BY | |
| date | |
| ORDER BY | |
| date; | |
| """ | |
| # Exécution de la requête et récupération du résultat sous forme de DataFrame | |
| df = pd.read_sql(query, conn) | |
| # Retour du DataFrame contenant les résultats | |
| return df | |
| except sqlite3.Error as e: | |
| # En cas d'erreur, on enregistre l'erreur dans les logs et on retourne un DataFrame vide | |
| logger.error(f"Erreur lors de la récupération des requêtes par jour : {e}") | |
| return pd.DataFrame() | |
| finally: | |
| # Fermeture de la connexion à la base de données | |
| conn.close() | |
| # Fonction pour récupérer les ingrédients depuis la base de données | |
| # def get_ingredients(): | |
| # conn = get_db_connection() | |
| # cursor = conn.cursor() | |
| # try: | |
| # cursor.execute("SELECT ingredients FROM liste_courses") | |
| # ingredients_list = cursor.fetchall() # Récupère tous les résultats | |
| # return ingredients_list | |
| # except Exception as e: | |
| # logger.error(f"Erreur lors de la récupération des requêtes par jour : {e}") | |
| # return pd.DataFrame() | |
| # finally: | |
| # # Fermer la connexion | |
| # cursor.close() | |
| # conn.close() | |
| def get_ingredients() -> list: | |
| """ | |
| Récupère la liste des ingrédients stockée dans la table `liste_courses` de la base de données SQLite. | |
| Cette fonction se connecte à la base de données SQLite, exécute une requête SQL pour récupérer la colonne `ingredients` | |
| de la table `liste_courses`, et retourne les résultats sous forme de liste. | |
| Returns: | |
| list: Une liste contenant les ingrédients récupérés de la base de données. | |
| Retourne une liste vide en cas d'erreur. | |
| """ | |
| # Connexion à la base de données SQLite | |
| conn = get_db_connection() | |
| # Si la connexion échoue, retourner une liste vide | |
| if conn is None: | |
| return [] | |
| cursor = conn.cursor() | |
| try: | |
| # Requête SQL pour récupérer la colonne 'ingredients' de la table 'liste_courses' | |
| cursor.execute("SELECT ingredients FROM liste_courses") | |
| # Récupère tous les résultats de la requête | |
| ingredients_list = cursor.fetchall() | |
| # Retourne la liste des ingrédients (sous forme de liste de tuples) | |
| return [ingredient[0] for ingredient in ingredients_list] | |
| except sqlite3.Error as e: | |
| # En cas d'erreur, on enregistre l'erreur dans les logs et on retourne une liste vide | |
| logger.error(f"Erreur lors de la récupération des ingrédients : {e}") | |
| return [] | |
| finally: | |
| # Fermeture du curseur et de la connexion à la base de données | |
| cursor.close() | |
| conn.close() | |
| # Fonction pour récupérer le coût total des requêtes | |
| # def get_total_cost(): | |
| # conn = get_db_connection() | |
| # if conn is None: | |
| # return 0.0 | |
| # try: | |
| # cursor = conn.cursor() | |
| # cursor.execute("SELECT SUM(total_cout) FROM messages WHERE total_cout IS NOT NULL") | |
| # result = cursor.fetchone() | |
| # return round(result[0], 2) if result[0] is not None else 0.0 | |
| # except Exception as e: | |
| # logger.error(f"Erreur lors de la récupération du coût total : {e}") | |
| # return 0.0 | |
| # finally: | |
| # cursor.close() | |
| # conn.close() | |
| def get_total_cost() -> float: | |
| """ | |
| Récupère le coût total des messages dans la table `messages` de la base de données SQLite. | |
| Cette fonction se connecte à la base de données SQLite, exécute une requête SQL pour récupérer la somme des valeurs | |
| présentes dans la colonne `total_cout` de la table `messages`, et retourne le total arrondi à 2 décimales. | |
| Returns: | |
| float: Le coût total des messages. Retourne 0.0 si aucune donnée n'est disponible ou en cas d'erreur. | |
| """ | |
| # Connexion à la base de données SQLite | |
| conn = get_db_connection() | |
| # Si la connexion échoue, retourner 0.0 | |
| if conn is None: | |
| return 0.0 | |
| cursor = conn.cursor() | |
| try: | |
| # Requête SQL pour récupérer la somme de la colonne 'total_cout' de la table 'messages' | |
| cursor.execute( | |
| "SELECT SUM(total_cout) FROM messages WHERE total_cout IS NOT NULL" | |
| ) | |
| # Récupère le résultat de la requête | |
| result = cursor.fetchone() | |
| # Retourne la somme arrondie à 2 décimales si un résultat est trouvé, sinon retourne 0.0 | |
| return round(result[0], 2) if result[0] is not None else 0.0 | |
| except sqlite3.Error as e: | |
| # En cas d'erreur, on log l'erreur et on retourne 0.0 | |
| logger.error(f"Erreur lors de la récupération du coût total : {e}") | |
| return 0.0 | |
| finally: | |
| # Fermeture du curseur et de la connexion à la base de données | |
| cursor.close() | |
| conn.close() | |
| # Fonction pour récupérer l'impact écologique estimé | |
| # def get_total_impact(): | |
| # conn = get_db_connection() | |
| # if conn is None: | |
| # return 0.0 | |
| # try: | |
| # cursor = conn.cursor() | |
| # cursor.execute("SELECT SUM(impact_eco) FROM messages WHERE impact_eco IS NOT NULL") | |
| # result = cursor.fetchone() | |
| # return round(result[0], 2) if result[0] is not None else 0.0 | |
| # except Exception as e: | |
| # logger.error(f"Erreur lors de la récupération de l'impact écologique : {e}") | |
| # return 0.0 | |
| # finally: | |
| # cursor.close() | |
| # conn.close() | |
| def get_total_impact() -> float: | |
| """ | |
| Récupère l'impact écologique total des messages dans la table `messages` de la base de données SQLite. | |
| Cette fonction se connecte à la base de données SQLite, exécute une requête SQL pour récupérer la somme des valeurs | |
| présentes dans la colonne `impact_eco` de la table `messages`, et retourne le total arrondi à 2 décimales. | |
| Returns: | |
| float: L'impact écologique total des messages. Retourne 0.0 si aucune donnée n'est disponible ou en cas d'erreur. | |
| """ | |
| # Connexion à la base de données SQLite | |
| conn = get_db_connection() | |
| # Si la connexion échoue, retourner 0.0 | |
| if conn is None: | |
| return 0.0 | |
| cursor = conn.cursor() | |
| try: | |
| # Requête SQL pour récupérer la somme de la colonne 'impact_eco' de la table 'messages' | |
| cursor.execute( | |
| "SELECT SUM(impact_eco) FROM messages WHERE impact_eco IS NOT NULL" | |
| ) | |
| # Récupère le résultat de la requête | |
| result = cursor.fetchone() | |
| # Retourne la somme arrondie à 2 décimales si un résultat est trouvé, sinon retourne 0.0 | |
| return round(result[0], 2) if result[0] is not None else 0.0 | |
| except sqlite3.Error as e: | |
| # En cas d'erreur, on log l'erreur et on retourne 0.0 | |
| logger.error(f"Erreur lors de la récupération de l'impact écologique : {e}") | |
| return 0.0 | |
| finally: | |
| # Fermeture du curseur et de la connexion à la base de données | |
| cursor.close() | |
| conn.close() | |