""" Script pour créer et initialiser la base de données. Fonctionne avec SQLite et MariaDB sans aucun if dans le code métier. Utilise le pattern Strategy pour déléguer les différences aux implémentations. """ from bdd.database import get_database def is_database_valid(): """Vérifie si la base de données est déjà bien configurée""" try: with get_database() as db: # Vérifier que toutes les tables existent tables_required = ["Users", "UE", "Matieres", "Notes"] for table in tables_required: try: # Tester si la table existe en comptant ses lignes db.fetchone(f"SELECT COUNT(*) FROM {table}") except Exception: print(f"Table {table} manquante ou invalide") return False # Vérifier qu'il y a au moins des données de test user_count = db.fetchone("SELECT COUNT(*) FROM Users")[0] ue_count = db.fetchone("SELECT COUNT(*) FROM UE")[0] matiere_count = db.fetchone("SELECT COUNT(*) FROM Matieres")[0] if user_count < 4 or ue_count < 3 or matiere_count < 6: print("Données de test incomplètes") return False # Vérifier l'intégrité : utilisateur "Djalim" existe djalim = db.fetchone("SELECT id FROM Users WHERE login = 'Djalim'") if not djalim: print("Utilisateur de test 'Djalim' manquant") return False print("Base de données déjà valide, aucune action nécessaire") return True except Exception as e: print(f"Erreur lors de la vérification de la base : {e}") return False def recreateDb(): """Recrée la base de données avec le nouveau schéma""" # Vérifier d'abord si la base est déjà valide if is_database_valid(): print("La base de données est déjà correctement configurée.") return print("Recréation de la base de données...") db = get_database() # Recréer la base (chaque backend sait comment faire) db.backend.recreate_database() # Créer les tables (chaque backend fournit son propre SQL) with get_database() as db: # Créer toutes les tables (SQL spécifique fourni par le backend) db.execute(db.backend.get_create_users_table_sql()) db.execute(db.backend.get_create_ue_table_sql()) db.execute(db.backend.get_create_matieres_table_sql()) db.execute(db.backend.get_create_notes_table_sql()) # Insérer les données de test (SQL générique avec placeholders) ph = db.backend.get_placeholder() print("Insertion des données de test...") # Créer un professeur db.execute( f"INSERT INTO Users (login, password, role, nom, prenom) VALUES ({ph}, {ph}, {ph}, {ph}, {ph})", ("prof1", "prof123", "prof", "Dupont", "Jean"), ) # Créer quelques élèves db.execute( f"INSERT INTO Users (login, password, role, nom, prenom) VALUES ({ph}, {ph}, {ph}, {ph}, {ph})", ("eleve1", "eleve123", "eleve", "Martin", "Sophie"), ) db.execute( f"INSERT INTO Users (login, password, role, nom, prenom) VALUES ({ph}, {ph}, {ph}, {ph}, {ph})", ("eleve2", "eleve123", "eleve", "Bernard", "Luc"), ) db.execute( f"INSERT INTO Users (login, password, role, nom, prenom) VALUES ({ph}, {ph}, {ph}, {ph}, {ph})", ("Djalim", "caca", "eleve", "Test", "User"), ) # Créer des UE db.execute( f"INSERT INTO UE (code, nom, description) VALUES ({ph}, {ph}, {ph})", ("UE1", "Informatique", "Unité d'enseignement informatique"), ) db.execute( f"INSERT INTO UE (code, nom, description) VALUES ({ph}, {ph}, {ph})", ("UE2", "Mathématiques", "Unité d'enseignement mathématiques"), ) db.execute( f"INSERT INTO UE (code, nom, description) VALUES ({ph}, {ph}, {ph})", ("UE3", "Sciences", "Unité d'enseignement sciences"), ) # Créer des matières db.execute( f"INSERT INTO Matieres (code, nom, ue_id, coefficient) VALUES ({ph}, {ph}, {ph}, {ph})", ("PYTHON", "Python", 1, 2.0), ) db.execute( f"INSERT INTO Matieres (code, nom, ue_id, coefficient) VALUES ({ph}, {ph}, {ph}, {ph})", ("JAVA", "Java", 1, 1.5), ) db.execute( f"INSERT INTO Matieres (code, nom, ue_id, coefficient) VALUES ({ph}, {ph}, {ph}, {ph})", ("ALGO", "Algorithmique", 1, 2.0), ) db.execute( f"INSERT INTO Matieres (code, nom, ue_id, coefficient) VALUES ({ph}, {ph}, {ph}, {ph})", ("MATH", "Mathématiques", 2, 3.0), ) db.execute( f"INSERT INTO Matieres (code, nom, ue_id, coefficient) VALUES ({ph}, {ph}, {ph}, {ph})", ("STAT", "Statistiques", 2, 2.0), ) db.execute( f"INSERT INTO Matieres (code, nom, ue_id, coefficient) VALUES ({ph}, {ph}, {ph}, {ph})", ("PHYSIQUE", "Physique", 3, 2.0), ) # Ajouter des notes pour Djalim (id=4) db.execute( f"INSERT INTO Notes (eleve_id, matiere_id, note) VALUES ({ph}, {ph}, {ph})", (4, 1, 18.5), # Python ) db.execute( f"INSERT INTO Notes (eleve_id, matiere_id, note) VALUES ({ph}, {ph}, {ph})", (4, 2, 15.0), # Java ) db.execute( f"INSERT INTO Notes (eleve_id, matiere_id, note) VALUES ({ph}, {ph}, {ph})", (4, 3, 16.5), # Algo ) db.execute( f"INSERT INTO Notes (eleve_id, matiere_id, note) VALUES ({ph}, {ph}, {ph})", (4, 4, 14.0), # Math ) db.execute( f"INSERT INTO Notes (eleve_id, matiere_id, note) VALUES ({ph}, {ph}, {ph})", (4, 5, 13.5), # Stat ) # Ajouter des notes pour eleve1 (id=2) db.execute( f"INSERT INTO Notes (eleve_id, matiere_id, note) VALUES ({ph}, {ph}, {ph})", (2, 1, 16.0), # Python ) db.execute( f"INSERT INTO Notes (eleve_id, matiere_id, note) VALUES ({ph}, {ph}, {ph})", (2, 4, 17.5), # Math ) db.commit() print("Base de données créée avec succès!") print(f"Backend utilisé: {db.backend.__class__.__name__}") print("\nComptes de test:") print("- Professeur: login=prof1, password=prof123") print("- Élève: login=eleve1, password=eleve123") print("- Élève: login=eleve2, password=eleve123") print("- Élève: login=Djalim, password=caca") if __name__ == "__main__": recreateDb()