Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
| restricted:std-3:tp3:travaux_pratiques_troisieme_seance_2017 [2017/09/27 12:53] – [4. Classe Employe] edauce | restricted:std-3:tp3:travaux_pratiques_troisieme_seance_2017 [2017/10/23 16:39] (Version actuelle) – edauce | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | ======TP3 : Persistance des données====== | ||
| + | |||
| + | De nombreux programmes utilisent des données situées sur une base de données séparée du programme lui-même. Le programme qui effectue les requêtes est appelé le “client”, | ||
| + | |||
| + | Le but de ce TP est d’écrire un programme client (en Python) qui se connecte à une base de données et affiche le résultat de quelques requêtes. | ||
| + | |||
| + | ====1. Lecture de la base==== | ||
| + | |||
| + | Nous travaillerons sur la base '' | ||
| + | |||
| + | <note tip> | ||
| + | Les employés sont décrits par les attributs : | ||
| + | |||
| + | **Employee** (employee_id, | ||
| + | |||
| + | **Employé**(id_employé, | ||
| + | )) | ||
| + | </ | ||
| + | |||
| + | Téléchargez {{https:// | ||
| + | |||
| + | sqlite3 foodmart.db | ||
| + | |||
| + | La base contient 2 tables : '' | ||
| + | |||
| + | tapez par exemple : | ||
| + | .schema employee | ||
| + | Vous voyez apparaître les commandes sql qui définissent la structure de la table. | ||
| + | tapez ensuite : | ||
| + | <code sql> | ||
| + | SELECT * FROM employee; | ||
| + | </ | ||
| + | la liste de employés s’affiche. | ||
| + | |||
| + | ==Testez les requêtes suivantes dans la base : == | ||
| + | Par exemple : | ||
| + | * Donner le nombre total d’employés | ||
| + | * Donner le nombre d’employés et le salaire moyen par magasin | ||
| + | * Donner les salaires min et max et moyen par catégorie managériale | ||
| + | * Donner la liste des magasins employant plus de 30 employés | ||
| + | * Donner le nom complet, la fonction et la catégorie managériale des employés supervisant plus de 5 employés | ||
| + | * Donner le nom complet, la fonction et la catégorie managériale des 10 employés ayant les plus hauts salaires | ||
| + | etc... | ||
| + | |||
| + | ====2. Création d’un nouveau projet Python==== | ||
| + | |||
| + | Le TP sera réalisé en Python. Lancez le programme pycharm et créez un nouveau projet. | ||
| + | |||
| + | Nous utiliserons comme dans le TP précédent la librairie sqlite3 dont les fonctionnalités permettent d’envoyer des requêtes vers un serveur de bases de données. | ||
| + | |||
| + | Commencez par importer la librairie mentionnée : | ||
| + | <code python> | ||
| + | import sqlite3 | ||
| + | </ | ||
| + | Déplacez le fichier '' | ||
| + | |||
| + | Créez un programme principal contenant le code suivant et exécutez-le: | ||
| + | <code python> | ||
| + | import sqlite3 | ||
| + | import os, sys | ||
| + | |||
| + | def connecte_base(db_name): | ||
| + | try: | ||
| + | assert os.path.isfile(db_name) | ||
| + | db = sqlite3.connect(db_name) | ||
| + | print(" | ||
| + | return db | ||
| + | except: | ||
| + | print(" | ||
| + | sys.exit() | ||
| + | |||
| + | db = connecte_base(" | ||
| + | </ | ||
| + | |||
| + | Pour pouvoir exécuter des requêtes dans la base, il faut créer un " | ||
| + | <code python> | ||
| + | c = db.cursor() | ||
| + | </ | ||
| + | |||
| + | Vous pouvez maintenant exécuter des requêtes à l'aide de ce curseur: | ||
| + | | ||
| + | Il est conseillé d' | ||
| + | |||
| + | <code python> | ||
| + | try: | ||
| + | c.execute(" | ||
| + | except sqlite3.OperationalError as e: | ||
| + | print(" | ||
| + | </ | ||
| + | |||
| + | Une fois la requête exécutée sans erreur, les réponses sont disponibles à l'aide de la commande '' | ||
| + | <code python> | ||
| + | liste_tuples = c.fetchall() | ||
| + | for t in liste_tuples: | ||
| + | print(t) | ||
| + | </ | ||
| + | |||
| + | Exécutez le programme et vérifiez qu’il n’y a pas d’erreur (la liste des clients s' | ||
| + | |||
| + | ====3. Premières requêtes==== | ||
| + | |||
| + | Le but de ce TP est d’écrire un programme capable de récupérer des informations de la table “employee”, | ||
| + | |||
| + | Recopiez maintenant le code suivant (remplace le code précédent): | ||
| + | |||
| + | <code python> | ||
| + | db = connecte_base(' | ||
| + | c = db.cursor() | ||
| + | try: | ||
| + | c.execute(" | ||
| + | liste_tuples = c.fetchall() | ||
| + | for t in liste_tuples: | ||
| + | num_employe = t[0]; | ||
| + | nom = t[1]; | ||
| + | print(num_employe , nom); | ||
| + | except sqlite3.OperationalError as e: | ||
| + | print(" | ||
| + | </ | ||
| + | |||
| + | <note tip> | ||
| + | **Explications** : | ||
| + | |||
| + | L’objet '' | ||
| + | * L’objet '' | ||
| + | * L’opération '' | ||
| + | * L’opération '' | ||
| + | * Pour afficher tout ou partie des réponses, il suffit parcourir les éléments de '' | ||
| + | |||
| + | |||
| + | <code python> | ||
| + | for t in liste_tuples: | ||
| + | … | ||
| + | </ | ||
| + | </ | ||
| + | Testez cette requête ainsi que les requêtes suivantes : | ||
| + | |||
| + | **3.1** - Comptez et affichez le nom, le prénom et le salaire des employés qui gagnent plus de 10000 dollars. | ||
| + | |||
| + | **3.2** - Comptez et affichez le nom complet (full_name), | ||
| + | |||
| + | ====4. Classe Employe==== | ||
| + | |||
| + | Définir une classe '' | ||
| + | * nom complet | ||
| + | * fonction | ||
| + | * date de naissance | ||
| + | * salaire | ||
| + | |||
| + | Définir un constructeur (prenant en paramètres 2 chaînes de caractères, | ||
| + | <code python> | ||
| + | def __init__(self, | ||
| + | </ | ||
| + | |||
| + | Définir une méthode <code python> | ||
| + | |||
| + | **4.1** - Testez ces deux méthodes dans le programme principal: reprenez la question 3.2 en stockant les résultats de la requête dans un objet de type Employe (à l'aide des attributs " | ||
| + | |||
| + | **4.2** - Vous définirez également un tableau d’employés contenant la liste des employés supervisés par Mona Jaramillo | ||
| + | |||
| + | **4.3** - Définir une méthode '' | ||
| + | Affichez le nom et le prénom du mieux payé des employés de Mona Jaramillo. | ||
| + | |||
| + | ====5. Classe Departement==== | ||
| + | |||
| + | Définir une classe '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * définir un constructeur (prenant en paramètres le numéro de département et la description) | ||
| + | * définir une méthode '' | ||
| + | |||
| + | **5.1** - Au niveau du programme principal, créez puis remplissez une liste de départements à partir de la table department. | ||
| + | |||
| + | **5.2** - Définir une méthode '' | ||
| + | |||
| + | **5.3** - Définir une méthode '' | ||
| + | |||