sian:2022:pythonmysql

TP sur mysql avec python

Si ce n'est pas fait installez pycharm version community et la librairie mysql-connector-python

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.

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)

Dans un nouveau programme,

  • obtenez la liste des cours, leur titre, et le champ duration.
  • Ce champs est sous la forme : x semaines ou x heures ou x 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}")
  • sian/2022/pythonmysql.txt
  • Dernière modification : 2022/10/26 17:48
  • de fabien.rico