179 lines
6.8 KiB
Python
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()
|