ProjetVM/bdd/GererBdd.py
2025-12-08 14:18:02 +01:00

179 lines
6.8 KiB
Python

"""
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()