NSI - Terminale - Activité base de données
Travail demandé
Partie 1: construire des requêtes SQL
Pour réaliser cette partie, vous allez utiliser une machine virtuelle Linux-mint sur laquelle a été installée le Système de Gestion de Base De Données (SGBDD) MariaDB.
Démarrez la machine virtuelle Linux-mint ( regardez si nécessaire la vidéo de mise en place d'une machine virtuelle en cliquant sur ce lien ).
Question 1.1
- Regardez la vidéo intitulée "requetes_terminal.mp4" en cliquant sur ce lien
Avec le terminal, connectez vous au SGBDD MariaDB avec le compte nsiuser dont le mot de passe est nsiuser,
puis demandez d'utiliser la base de données gestion__notes comme montré dans la vidéo. - Affichez les tables présentes dans la base de données gestion__notes.
- Faites une capture d'écran de votre commande et de la réponse de la SGBDD.
Question 1.2
- Afficher le contenu de la table PROFESSEUR.
- Faites une capture d'écran de votre commande et de la réponse de la SGBDD.
- Saisissez la commande quit pour quitter la session.
- Refermez le terminal.
Question 1.3
- A partir de maintenant, vous allez utiliser le logiciel PHP myadmin. Regardez la vidéo "phpmyadmin.mp4" en cliquant sur ce lien
- Écrivez une requête INSERT pour ajouter le devoir DS1 de la discipline NSI dans la table Devoir ( faîtes une capture d'écran à mettre dans le compte rendu).
- Vérifiez que la requête s'est bien exécutée en consultant la table DEVOIR.
- Faites une capture d'écran de votre commande et de la réponse de la SGBDD.
Question 1.4
- Ecrivez une requête INSERT sur la table APPARTENIR pour ajouter les élèves Auboisdormant et Ozor en classe de 1G1.
- Vérifiez que la requête s'est bien exécutée en consultant la table APPARTENIR.
- Faites une capture d'écran de votre commande et de la réponse de la SGBDD.
Question 1.5
- On vous donne ci-dessous la requête qui a permis de créer la table FAIRE.
Cette table permet d'associer: une discipline, un devoir, un élève, la date du devoir et la note qu'a obtenue l'élève à ce devoir.
- Précisez sur votre compte rendu les clés étrangères de la table FAIRE ainsi que sa clé primaire ( rappel: une clé primaire peut être constituée de plusieurs attributs qui sont souvent des clés primaires d'autres tables).
Question 1.6
- Ecrivez la requête qui ajoute une note de 15.5, obtenue au devoir DS1 de mathématiques par l'élève Nordine Ozor. La note ayant été obtenue le 01/09/23 ce qui se note au format date SQL: ' 2023-09-01'
- Ecrivez la requête qui ajoute une note de 13.5, obtenue au devoir DS2 de mathématiques par l'élève Nordine Ozor. La note ayant été obtenue le 19/09/23.
- Vérifiez que vos requêtes se sont bien exécutées en consultant la table FAIRE.
- Faites une capture d'écran de vos commandes et de la réponse de la SGBDD.
Question 1.7
- Le prof de maths a oublié un point au devoir DS2 de mathématiques de l'élève Nordine Ozor, il faut donc mettre à jour la table FAIRE, pour remplacer la note de 13.5 par 14.5. Ecrivez la requête qui fait cette mise à jour.
- Vérifiez que la requête s'est bien exécutée en consultant la table FAIRE.
- Faites une capture d'écran de votre commande et de la réponse de la SGBDD.
Question 1.8
- Ecrivez la requête qui calcule la moyenne de mathématiques de l'élève Nordine Ozor.
Question 1.9
- Ecrivez la requête avec JOINTURE entre les tables AFFECTER et PROFESSEUR qui permet d'afficher le nom du professeur de mathématiques de la classe de 1G1.
- Faites une copie de la requête et du résultat obtenu pour le compte rendu.
Question 1.10
- Ecrivez la requête avec JOINTURE entre les tables APARTENIR et ELEVE qui permet d'afficher le nom et le prénom des élèves de seconde 1.
- Faites une copie de la requête et du résultat obtenu pour le compte rendu.
Partie 2: interaction Python et Mysql
Dans cette partie vous allez créer une application python qui communique avec la base de données "gestion__notes", l'objectif sera de créer un logiciel qui permette de lire les résultats d'un élève et d'ajouter des notes. Vous devez utiliser python dans la machine virtuelle.
Principe
Pour communiquer avec le SGBDD mysql depuis python, vous devez utilisez le module mysql.connector de python. Le code ci-dessous vous montre le principe, les commentaires en vert expliquent les lignes de code qui suivent:
NE PAS TESTER LE CODE, JUSTE LIRE LES COMMENTAIRES QUI EXPLIQUENT LE CODE POUR ESSAYER DE COMPRENDRE LE PRINCIPE
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|
Question 2.1
-
Lancez le logiciel VSCodium avec le raccourci du bureau de linux Mint:
-
Sélectionnez le dossier Python-scripts du volet de gauche puis cliquez gauche sur test.py:
Copiez_collez, dans le fichier test.py, tout le code python donné dans la partie principe au dessus de la question 2.1 et BIEN vérifier l'indentation des blocs de code notamment au niveau des blocs try et except.
Exécutez le code en cliquant sur la flèche en haut à gauche (entourée dans l'image ci-dessous):
Faites une copie du résultat obtenu dans la console. Concluez sur l'aptitude de python à communiquer à votre base de données.
Question 2.2
- Modifiez la valeur de la chaîne affectée à la variable la_requete pour récupérer la liste des noms de disciplines ( cela revient à écrire une chaîne de caractères qui contient la requête SQL qui lit le champ NOM_DISC de la table DISCIPLINE), la ligne à modifier est:
1 2 |
|
Question 2.3
Vous allez maintenant voir comment récupérer plusieurs informations d'une table, par exemple, récupérons le nom et le prénom des professeurs. Vous remarquerez que le programme est similaire au précédent:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
|
- Modifiez le code précédent pour récupérer le nom et le prénom de tous les élèves que vous afficherez dans la console python.
- Testez le code, faites une copie du résultat obtenu pour le compte rendu.
Question 2.4
- Modifiez le code précédent pour récupérer uniquement le nom et le prénom des élèves de seconde 1 que vous afficherez dans la console python ( revoir votre réponse à la question 1.10).
Question 2.5
Création d'une Interface Homme- Machine (IHM)
Le code python ci-dessous créé une IHM avec tkinter qui va permettre d'afficher les informations de la base de données dans une fenêtre:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|
Testez ce code python, faites une copie du résultat obtenu pour le compte rendu.
Question 2.6
Ajout des données de la bdd à la liste Classes.
Pour pouvoir renseigner les données de la liste déroulante, il faut se connecter à la base de données et remplir la liste list_classes comme vu dans les questions précédentes.
Ici on écrit une fonction initialisation() qui initialise la liste des classes:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|
Testez le code, faites une copie du résultat obtenu pour le compte rendu.
Question 2.7
Ajout des données de la base à la liste élèves.
Le contenu de la liste déroulante Liste élèves dépend de la classe qui est sélectionnée, il faut donc récupérer l'élément sélectionné dans la liste Classes et agir en conséquence, la liste sera initialement remplie avec les éléments de la première classe qui est affichée ( ici 1G1), pour avoir les élèves de la 1G1 au lancement de l'application, on modifie la fonction initialisation() en ajoutant la requête requete_eleves ( code lignes 12-13 ci-dessous), l'itérateur for à la ligne 14 récupère le résultat de cette requête et remplit la liste liste_eleves_classe_selectionnée, cette liste est ensuite affectée à la liste déroulante à la ligne 28, le premier élement de la liste déroulante est affichée par défaut grâce à la ligne de code 30 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
|
Testez le code, faites une copie du résultat obtenu pour le compte rendu.
Question 2.8
Réaction à un événement changement de classe
En cas de sélection d'une autre classe dans la liste déroulante des Classes, l'événement "nouvel item sélectionné" doit être détecté et conduire à la mise à jour des données de la liste déroulante des élèves pour afficher la liste des élèves de cette nouvelle classe, voyons comment faire ça.
La méthode bind() de l'objet liste déroulante ( combobox en Anglais) permet de lier un événement détecté par le système d'exploitation ( Windows, Linux..) avec une fonction qui doit s'exécuter quand ce type d'événement est détecté.
Un événement en python s'écrit <<nom_de_événement>>, l'événement qui nous intéresse est ici :
<<ComboboxSelected>> ce qui pourrait se traduire par << nouvel élément de combobox sélectionné>>
On va lier ensuite cet événement à une fonction que l'on appelera mise_a_jour_liste_eleves(eventObject) qui aura pour rôle de mettre à jour la liste déroulante des élèves.
Remarque: en python, les fonctions associées à des événements ont toujours un paramètre entre les parenthèses appelé eventObject. Ce paramètre est un objet que le système d'exploitation ( Windows, Linux..) renseigne, on ne s'en servira pas ici mais il est obligatoire ( on s'en sert dans les fonctions de gestion d'événements des touches de clavier par exemple pour savoir quelle touche a été enfoncée).
Dans le code, on doit ajouter l'utilisation de la méthode bind() à l'objet liste déroulante combo_affichage_liste_classes pour lier l'événement <<ComboboxSelected>> et la fonction mise_a_jour_liste_eleves(eventObject) c'est ce que fait la ligne de code 5 ci-dessous:
1 2 3 4 5 6 7 |
|
combo_affichage_liste_classes.bind("<<ComboboxSelected>>", mise_a_jour_liste_eleves)
et surtout pas:
combo_affichage_liste_classes.bind("<<ComboboxSelected>>", mise_a_jour_liste_eleves(eventObject))
On écrit ensuite le code de la définition de la fonction mise_a_jour_liste_eleves(eventObject) que l'on place juste après la définition de la fonction initialisation():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|

Remarque:
on doit retrouver l'id de la la classe sélectionnée, ce qui demande une requête comme ci-dessous:
"...... ( SELECT ID_CLASS FROM CLASSE WHERE NOM_CLASS=\'{}\') ".format(nom_classe_sélectionnée)
La méthode format(..) d'une chaine de caractères permet d'injecter la valeur de variables dans la chaîne de caractères.
Le principe est le suivant, on met des accolades à l'endroit de la chaîne où la valeur des variables seront placées, exemple:
a = 'Clette'
b = 'Lara'
c = 'seconde 1'
" {} {} est une élève de {} ".format(b, a, c) donnera la chaine " Lara Clette est une élève de seconde 1 "
ainsi si la variable nom_classe_sélectionnée = '201', la requête:
"...... ( SELECT ID_CLASS FROM CLASSE WHERE NOM_CLASS=\'{}\') ".format(nom_classe_sélectionnée)
devient:
...... ( SELECT ID_CLASS FROM CLASSE WHERE NOM_CLASS='201')
- Testez le code en ajoutant la définition de la fonction mise_a_jour_liste_eleves(eventObject) et en ajoutant la ligne de code de la méthode bind() comme c'est montré ci-dessus. ATTENTION, lors du test Il vous faudra sélectionner une classe qui a des élèves inscrits dans la base de données comme la classe 201, vous n'avez pas inscrit d'élèves en TG1 , faites une copie du résultat obtenu pour le compte rendu.
Question 2.9
c'est la question synthèse à faire si vous avez compris tout ce qui a été réalisé jusqu'ici
- Ajoutez deux labels en colonne 2 pour afficher la moyenne de l'élève sélectionné:
Pour afficher le label vide, à fond blanc, d'une largeur de 10px, décaler de 10px par rapport au bords, vous pouvez coder:
label_moyenne = Label(fen, text=" ", bg="white", width=10 ).grid( padx=10, row=1, column=2)
- Ajoutez la méthode bind() à la liste déroulante combo_affichage_liste_élèves_classe qui liera l'événement <<ComboboxSelected>> à la fonction calcul-moyenne(eventObject) que vous définirez pour accéder aux notes de l'élève sélectionné.
- Testez votre code ( ATTENTION , pensez à sélectionner des élèves qui ont des notes, Nordine Ozor par exemple ) , faites une copie du résultat obtenu pour le compte rendu.