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:tc-d:tp3:travaux_pratiques_troisieme_seance_2017 [2017/10/18 21:33] – [4. Classe Employe] edauce | restricted:tc-d:tp3:travaux_pratiques_troisieme_seance_2017 [2019/01/13 17:38] (Version actuelle) – edauce | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ======TP12 : 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 l' | ||
+ | * Donner le nom du superviseur D'Ana Quick | ||
+ | * 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==== | ||
+ | |||
+ | Nous définissons ici une classe '' | ||
+ | * nom complet | ||
+ | * fonction | ||
+ | * date de naissance | ||
+ | * salaire | ||
+ | |||
+ | <note tip> **Les classes en Python** | ||
+ | |||
+ | Les classes servent à programmer de façon modulaire via la définition d' | ||
+ | |||
+ | * {{https:// | ||
+ | * {{https:// | ||
+ | |||
+ | Les classes servent à définir des **objets**. Les objets sont des variables contenant des données obéissant à un certain format. Ici, un objet de la classe Employé contiendra quatre valeurs correspondant aux quatre attributs définis dans le constructeur '' | ||
+ | </ | ||
+ | |||
+ | Ajoutez dans votre projet un fichier '' | ||
+ | |||
+ | <code python> | ||
+ | class Employe: | ||
+ | def __init__(self, | ||
+ | self.nom_complet = nom_complet | ||
+ | self.fonction = fonction | ||
+ | self.date_de_naissance = date_de_naissance | ||
+ | self.salaire = salaire | ||
+ | </ | ||
+ | |||
+ | <note important> | ||
+ | * Les noms de classes commencent par une majuscule | ||
+ | * Toutes les classes doivent être testées ! (voir [[https:// | ||
+ | </ | ||
+ | |||
+ | **4.1** - Testez cette méthode dans le programme principal: | ||
+ | * Importez tout d' | ||
+ | <note tip> | ||
+ | L' | ||
+ | </ | ||
+ | * initialisez un objet '' | ||
+ | <note tip> | ||
+ | Voici la ligne de code permettant d' | ||
+ | <code python> | ||
+ | e = Employe(full_name, | ||
+ | </ | ||
+ | Apres initialisation, | ||
+ | </ | ||
+ | * Affichez ensuite les valeurs contenues dans l' | ||
+ | |||
+ | **4.2** - Définissez selon ce principe la liste des employés supervisés par Mona Jaramillo | ||
+ | |||
+ | **4.3** - Ajoutez dans la classe '' | ||
+ | |||
+ | <note tip> | ||
+ | Les méthodes sont des fonctions définies dans une classe. Le premier argument d'une méthode (nommé '' | ||
+ | <code python> | ||
+ | def mieux_paye_que(self, | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | Pour utiliser une méthode, on utilise également la notation pointée. Ainsi, si '' | ||
+ | |||
+ | Pour comparer les salaires, on utilisera '' | ||
+ | </ | ||
+ | |||
+ | **4.3** - Affichez dans le programme principal 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** - Affichez le contenu de la table Department. | ||
+ | |||
+ | **5.2** - Au niveau du programme principal, créez puis remplissez une liste de départements à partir de la table Department. | ||
+ | |||
+ | **5.3** - Définir une méthode '' | ||
+ | |||
+ | **5.4** - Définir une méthode '' | ||