From 3f9e410fb6f496b919db4570639aee92e402884b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Derrode?= <stephane.derrode@ec-lyon.fr>
Date: Fri, 24 Sep 2021 16:06:49 +0200
Subject: [PATCH] update sujet #3

---
 seance3_4h/seance3_4h.md | 152 ---------------------------------------
 1 file changed, 152 deletions(-)

diff --git a/seance3_4h/seance3_4h.md b/seance3_4h/seance3_4h.md
index b80d1b7..3c648b5 100644
--- a/seance3_4h/seance3_4h.md
+++ b/seance3_4h/seance3_4h.md
@@ -4,14 +4,6 @@
 
 # BE #3 : Exceptions et Base de données SQL
 
-__Ceci est la version enseignants incluant les corrections__
-
-__Note aux enseignants__ Ce document est la __version enseignant__ du BE #3 incluant les solutions aux questions posées. L'énoncé porte sur l'utilisation des exceptions, dans le contexte de la manipulation de bases SQL en POO. Il reprend la même librairie (_sqlite3_) que le BE #1 de INF-TC3. Ce BE doit également permettre aux étudiants d'utiliser la librairie graphique orientée objet _matplotlib.pyplot_ pour illustrer les requêtes de la dernière partie (cf _Requêtes libres_).
-
-Ce BE sera noté, les consignes pour rendre le travail sont expliquées dans le fichier _consignes_BE#3.md_, disponible au même endroit que cet énoncé. Pendant les 2 premières heures, les élèves vont apprendre à gérer des exceptions provoquées par des requêtes SQL avec la librairie _sqlite3_ (et se remémorer la syntaxe _SQL_). Les 2 heures suivantes (en autonomie) sont consacrées au design et à l'implémentation de 2 requêtes, à partir d'une bdd de leur choix. Cela doit permettre à chaque étudiant de faire un rendu personnalisé (requêtes et affichages graphiques des résultats), tout en prenant soin de la robustesse de leur code grâce aux exceptions. Cela devrait favoriser un travail personnel des étudiants/binômes puisque chaque requête doit être unique.
-
-Dans le support de cours, les explications concernant la gestion des exceptions commencent à la planche #55 (cf fichier _Python++.pdf_ sur _Pedagogie1_).
-
 ---
 L'objectif principal de ce BE concerne l'utilisation **des exceptions** ([lien](https://docs.python.org/fr/3/tutorial/errors.html) officiel, [tuto _devstory_](https://devstory.net/11421/python-exception-handling) sur les exceptions) pour améliorer la robustesse d'un code. Pour expérimenter ce concept clé, nous nous servirons du prétexte de la manipulation de bases de données à l'aide de requêtes _SQL_ (_Structured Query Language_), écrites en _Python_. Ce BE est composé de trois parties :
 
@@ -148,28 +140,6 @@ On constate, dans chaque situation, que l'exception `sqlite3.OperationalError` e
 La liste des exceptions lancées par l'usage de commandes `sqlite3` est disponible en suivant [ce lien](https://docs.python.org/3/library/sqlite3.html#exceptions). Prenez le temps de lire la description des différentes exceptions. Toutes les exceptions de ce module héritent d'une classe appelée __sqlite3.Error__ (elle-même héritant de la classe de base de gestion des exceptions de _Python_ : __Exception__).
 
 
----
-<p class=correction>
-<b>Éléments de réponse pour les enseignants</b>
-</p>
-
-Si on donne un mauvais nom pour la Bdd, alors elle est ouverte en écriture (et donc vide), d'où l'erreur sur le nom de la table.
-
-```python
-# programme importBdd_3.py
-import sqlite3
-if __name__ == '__main__':
-	try:
-		conn = sqlite3.connect('hotellerie.db')
-		curseur = conn.cursor()
-		curseur.execute("SELECT nom, ville FROM hotel;")
-		print(curseur.fetchall())
-	except sqlite3.OperationalError as err:                 # interception d'une exception spécifique
-		print('err:', str(err))
-		print('type exception:', type(err).__name__)
-	finally:                                                # fermeture de la base dans tous les cas
-		conn.close()
-```
 
 ---
 ## 2. Classe HotelDB (75 min.)
@@ -207,70 +177,6 @@ __Améliorations à implémenter__ :
 
 Veillez à ce que ces _appels erronés_ renvoient une liste vide tout simplement.
 
----    
-<p class=correction>
-<b>Éléments de réponse pour les enseignants</b>
-</p>
-
-_Remarque_ : insister sur la gestion des exceptions pour traiter des arguments erronés
- en type (_P. ex._ chaîne de caractères au lieu d'un entier).
-
-```python
-import sqlite3
-
-class HotelDB:
-
-	def __init__(self, nom):
-		self.__DBname = nom
-		self.__conn = sqlite3.connect(self.__DBname)
-
-	def get_name_hotel_etoile(self, nbetoiles):
-		curseur = self.__conn.cursor()
-		liste = []
-		try:
-			# assert nbetoiles>0, "Le nbre d'étoiles doit être > 0 !" # peut remplacer la suivante
-			if nbetoiles<=0:
-				raise ValueError("Le nbre d'étoiles doit être > 0 !")
-			#curseur.execute('SELECT nom FROM hotel WHERE etoiles=%d' % nbetoiles)      # obsolete
-			#curseur.execute('SELECT nom FROM hotel WHERE etoiles=?', (nbetoiles,))     # secure
-			curseur.execute('SELECT nom FROM hotel WHERE etoiles={}'.format(nbetoiles))
-		except sqlite3.OperationalError as sqlerr:
-			print('{} in {}'.format(str(sqlerr), self.__DBname))
-		except TypeError as typerr:
-			print('TypeError: {}'.format(str(typerr)))
-		except ValueError as valerr:
-			print('ValueError: {}'.format(str(valerr)))
-		# except AssertionError as asserr:
-		# 	print('AssertionError: {}'.format(str(asserr)))
-		else:
-			liste = curseur.fetchall()
-		
-		return liste
-
-	def __del__ (self):
-		self.__conn.close() 
-	def __str__(self):
-		return 'Base de données : ' + self.__DBname
-
-if __name__ == '__main__':
-
-	aHotelDB = HotelDB('hotellerie.db')
-	nbEtoiles = 2
-	resultat = aHotelDB.get_name_hotel_etoile(nbEtoiles)
-	print("Liste des noms d'hotel", nbEtoiles, "étoiles : ", resultat)
-	
-	print("Liste des noms d'hotel : ", aHotelDB.get_name_hotel_etoile(-1))
-	print("Liste des noms d'hotel : ", aHotelDB.get_name_hotel_etoile("Hello"))
-```
-
-Ce qui donne
-```
-Liste des noms d'hotel 2 étoiles :  [('La nuit noire',), ('Hotel chez soi',), ('Chez Philippe',)]
-ValueError: Le nbre d'étoiles doit être > 0 !
-Liste des noms d'hotel :  []
-TypeError: '<=' not supported between instances of 'str' and 'int'
-Liste des noms d'hotel :  []
-```
 
 ### 2.2 Requête en écriture (45 min.)
 
@@ -286,64 +192,6 @@ _Remarques_ :
  - Pensez à quitter le logiciel `DB Browser for SQLite` avant d'exécuter votre programme.    
  - En cas de destruction de la base `Hotellerie.db` (les requêtes en écriture sont toujours plus dangereuses que les requêtes en lecture !), pensez à la télécharger à nouveau !
 
-------
-<p class=correction>
-<b>Éléments de réponse pour les enseignants</b>
-</p>
-
-```python
-import sqlite3
-
-class HotelDB:
-
-	...
-
-	def add_new_client(self, prenom, nom):
-		# On recherche si le client est là !
-		curseur = self.__conn.cursor() 
-		try:
-			#curseur.execute("SELECT numclient FROM client WHERE nom='%s' \
-			#					AND prenom='%s'" % (nom, prenom))             # obsolete
-			#curseur.execute("SELECT numclient FROM client WHERE nom=? \
-			#					AND prenom=?", (nom, prenom))                 # secure
-			curseur.execute("SELECT numclient FROM client WHERE nom='{}' \
-								AND prenom='{}'".format(nom, prenom))
-		except sqlite3.OperationalError as sqlerr:
-			print('{} in {}'.format(str(sqlerr), self.__DBname))
-			return None
-
-		liste = curseur.fetchall() # pas d'homonyme dans le fichier
-		if len(liste) != 0:
-			print('Le client existe déjà')
-			return liste[0]
-
-		# on ajoute le client (la clé primaire est ajouté automatiquement)
-		curseur.execute("INSERT INTO client(nom, prenom) VALUES ('{}', '{}')".format(nom, prenom))
-		
-		# Ne pas oublier de MAJ le fichier
-		self.__conn.commit() 
-		return curseur.lastrowid
-
-
-if __name__ == '__main__':
-
-	aHotelDB =  HotelDB('hotellerie.db')
-	# IDClient1 = aHotelDB.add_new_client("Svetlana", "Kapriski")
-	# print('ID client:', IDClient1)
-	IDClient2 = aHotelDB.add_new_client("Toto", "Zero") #
-	print('ID client:', IDClient2)
-
-```
-
-Ce qui donne, lors de la première exécution
-```bash
-ID client: 180
-```
-et lors de la seconde exécution
-```bash
-Le client existe déjà
-ID client: 180
-```
 
 ---
 ## 3. Requêtes libres (120 min. et +)
-- 
GitLab