TP sur mysql avec python
Si ce n'est pas fait installez pycharm version community et la librairie mysql-connector-python
Premiers pas
Faites un programme python qui se connecte à la base de données du dernier cours
- Faites une requête obtenant tous les mots clefs que vous affichez
- Utilisez
fetchone
pour la récupération des résultats
cliquez ici pour la correction
cliquez ici pour la correction
Je donne plusieurs corrections. Le sujet est peu précis et il y a plusieurs façon d'afficher les résultats. Ici, il y a par exemple 3 requetes possible qui répondent au sujet et bien sur ce que vous avez proposé peut être différent.
import mysql.connector if __name__ == "__main__": db = mysql.connector.connect( host="bdd.imst.os.univ-lyon1.fr", user="etudiant", password="sqlavance", database="funmooc" ) # creation du cursor: cur = db.cursor() # Il y a plusieurs requetes possibles qui correspondent à la question posée qui n'est pas claire # # cette requete affiche les mots clefs mais on sais juste qu'il est présent dans la base sans savoir s'il est utilisé # requete = "SELECT title, genre FROM categories WHERE genre = 'subjects';" # celle-ci donne pour chaque cours les mots clef qui le concerne, on sais donc lequels # sont répétés plusieurs fois requete = """ SELECT categories.title as motclef, courses.title as titre FROM courses, categories, courses_categories WHERE courses_categories.id_course = courses.id AND courses_categories.id_categorie = categories.id AND categories.genre = 'subjects' """ # # on pourrait aussi directement demander le comptage des mots clef à la base via un GROUP BY # requete = """ # SELECT categories.title as motclef, count(*) as nombre FROM courses, categories, courses_categories # WHERE courses_categories.id_course = courses.id # AND courses_categories.id_categorie = categories.id # AND categories.genre = 'subjects' # GROUP BY categories.id # """ # exécution de la requete cur.execute(requete) cnames = "\t".join(cur.column_names) print(cnames) # print(cur.column_names) while True: rep = cur.fetchone() if rep is None: break motclef = rep[0] print(motclef) print(rep)
J'ajoute un autre code qui utilise le comptage des mots clefs pour faire un nuage de mots. Ça vous demande d'installer une ou deux bibliothèques supplémentaires, mais ça permet de voir ce qu'on peut faire simplement.
import mysql.connector import wordcloud import matplotlib.pyplot as plt if __name__ == "__main__": db = mysql.connector.connect( host="bdd.imst.os.univ-lyon1.fr", user="etudiant", password="sqlavance", database="funmooc" ) # creation du cursor: cur = db.cursor() # # on pourrait aussi directement demander le comptage des mots clef à la base via un GROUP BY requete = """ SELECT categories.title as motclef, count(*) as nombre FROM courses, categories, courses_categories WHERE courses_categories.id_course = courses.id AND courses_categories.id_categorie = categories.id AND categories.genre = 'subjects' GROUP BY categories.id """ # exécution de la requete cur.execute(requete) cnames = "\t".join(cur.column_names) print(cnames) # print(cur.column_names) # un dictionnaire pour stocker les frequences frequences = {} while True: rep = cur.fetchone() if rep is None: break motclef = rep[0] nb = rep[1] print(f"{motclef} : {nb}") frequences[motclef] = nb # génération du nuage wordcloud = wordcloud.WordCloud().generate_from_frequencies(frequences) # affichage plt.imshow(wordcloud, interpolation='bilinear') plt.axis("off") plt.show()
La façon la plus fiable et simple que j'ai vu sur vos machines est d'utiliser pip
pour l'installation des bibliothèques.
En utilisant pycharm
cela signifie que vous ouvrez un terminal dans le projet python et tapez:
pip3 install wordcloud
Pour ceux qui utilisent un autre IDE, vous devriez pouvoir utiliser la même commande dans un terminal.
Utilisation de requêtes paramétrées
Dans un nouveau programme,
- Demandez un mot clef grâce à
input
. - Récupérez le titre des cours ayant ce mot clef.
- Attention à l'injection sql dans ce programme.
Cliquez pour afficher ⇲
Cliquez pour masquer ⇱
import mysql.connector if __name__ == "__main__": db = mysql.connector.connect( host="bdd.imst.os.univ-lyon1.fr", user="etudiant", password="sqlavance", database="funmooc" ) # creation du cursor: cur = db.cursor() requete = """ SELECT categories.title as motclef, courses.title as titre FROM courses, categories, courses_categories WHERE courses_categories.id_course = courses.id AND courses_categories.id_categorie = categories.id AND categories.genre = 'subjects' AND categories.title LIKE %(valeur)s; """ motrechercher = input("Entrez une valeur à rechercher : ") chainerequete = "%"+motrechercher+"%" print(f"On cherche le mot clef {motrechercher}") # exécution de la requete cur.execute(requete, {"valeur": chainerequete}) while True: rep = cur.fetchone() if rep is None: break motclef = rep[0] print(motclef) print(rep)
Traitement sur les données
Dans un nouveau programme,
- obtenez la liste des cours, leur titre, et le champ
duration
. - Ce champs est sous la forme :
x semaines
oux heures
oux mois
.
Essayez d'extraire la valeur numérique, de la convertir en jours et de l'afficher.
Cliquez pour afficher ⇲
Cliquez pour masquer ⇱
import mysql.connector import re if __name__ == "__main__": db = mysql.connector.connect( host="bdd.imst.os.univ-lyon1.fr", user="etudiant", password="sqlavance", database="funmooc" ) # creation du cursor: cur = db.cursor() requete = """ SELECT courses.title as titre, courses.duration as duree FROM courses WHERE 1; """ # exécution de la requete cur.execute(requete) ## lecture de chaque ligne while True: rep = cur.fetchone() if rep is None: break titre = rep[0] duree = rep[1] print(f"Cours: '{titre}'\tduree: '{duree}'") ## récupération de la durée m = re.match("([0-9]+) (.*)", duree) if m: num = m.group(1) mot = m.group(2) print(f"Durée en {mot} de {num}") else: print("J'ai eu un problème pour la regex on met 0 par défaut") num = 0 mot = "semaines" ## conversion en jours if mot == "semaines" or mot == "semaine": duree_jours = int(num)*7 elif mot == "heures": duree_jours = int(num)/24.0 elif mot == "mois": duree_jours = int(num)*30 elif mot == "jours": duree_jours = int(num) else: print(f"Une duree de {num} {mot}") break print(f"Durée en jours: {duree_jours}")