Utiliser les bases de données avec Python

Se connecter à la base de données

Télécharger et installer le connecteur MySQL pour Python à l'adresse http://dev.mysql.com/downloads/connector/python/ (le fichier est dans le dossier partagé Progs)

import mysql.connector serveur = "10.187.36.203" # nom ou numéro IP du serveur login = 'btssio' # login de connexion pwd = 'btssio' # Mot de passe pour la connexion base = 'glpi' #nom de la base de données #Connexion a la base bdd=mysql.connector.connect(user=login, password=pwd, host=serveur, database=base)

Gérer les exceptions

S'il y a une erreur à la connexion (serveur indisponible, erreur de login ou de mot de passe, base de données inconnue), le programme python génère une exception et s'arrête.

Il est donc pertinent de gérer ces erreurs et de gérer quelle erreur est survenue sans arrêter l'exécution du programme python.

Pour cela, il faut mettre dans un bloc try les instructions à tester et dans except les instructions à exécuter en cas d'erreur.

Syntaxe de base :

try: # Bloc à essayer except: # Bloc qui sera exécuté en cas d'erreur

Mise en œuvre

#Connexion a la base try: connexion=mysql.connector.connect(user=login, password=pwd, host=serveur, database=base) except mysql.connector.Error as err: if err.errno == mysql.connector.errorcode.ER_DBACCESS_DENIED_ERROR: print("Base inconnue") elif err.errno == mysql.connector.errorcode.ER_ACCESS_DENIED_ERROR: print("Erreur login ou pwd") else: print(err) print("connexion réussie")

Le bloc except permet de gérer précisément le type d'erreur en récupérant le numéro d'erreur puis en l'utilisant pour préciser l'erreur. Il faut dans ce cas savoir quels sont les numéros d'erreur possibles.

Pour le savoir consultez l'aide du module.

Aide sur le module :

help ('mysql.connector')

Aide sur les erreurs du module

help ('mysql.connector.errorcode')

Exécuter une requête

L'exécution d'une requête qui renvoie plusieurs tuples (lignes, enregistrement) nécessite d'utiliser un curseur.

cursor=connexion.cursor() #Definition du curseur requeteSQL= "Select * from eleve" # Definition de la requête cursor.execute(requeteSQL) # Execution de la requête resultat = cursor.fetchall() #Recuperation des donnees

Si votre requête ne retourne aucun résultat, ce qui est le cas d'une requête de mise à jour (update) ou de création d'enregistrement (insert), il n'est pas nécessaire d'utiliser la méthode fetchall().

Utilisation des données

Une boucle est nécessaire pour récupérer les données ligne par ligne.

for row in resultat: print(row[0]) # champ 1 du select print(row[1]) # champ 2 du select print(row[2]) # champ 3 du select

Fermeture de la connexion

cursor.close() #Fermeture du curseur connexion.close() #Deconnexion de la base

Projet à réaliser

Modifiez votre programme Python WOL afin de récupérer dans la base de données de GLPI l'adresse MAC d'un ordinateur à partir de son nom. De cette manière, il suffira de saisir le nom du poste dans votre programme Python pour récupérer dans la base GLPI, son adresse MAC.

Les tables GLPI à utiliser sont glpi_computers (liste des ordinateurs) et glpi_computers_devicenetworkcards (choisissez l'adresse MAC de la carte réelle - physique)

Utiliser une classe pour simplifier le code

La classe de base d'accès aux données :

class connexionBD: """Connexion à la base de donnee""" def __init__(self): # Création d'une connexion à la base import mysql.connector self.serveur = "10.187.36.203" self.login = "btssio" self.pwd = "btssio" self.base = "glpi" self.__connection = mysql.connector.connect(user=self.login, password=self.pwd, host=self.serveur, database=self.base) self.__cursor = self.__connection.cursor() def close(self): #! Ferme la connexion self.__cursor.close() self.__connection.close() def execute(self, requete): #! Execute la requete MySQL et retourne le resultat self.__cursor.execute(requete) return self.__cursor.fetchall()

Insérer des données

Exemple : créer un enregistrement élève :

connexion = connexionBD() requete = "INSERT INTO eleve (nom, prenom) VALUES('Dupond','Raymond')" # La requete est toujours un string connexion.execute(requete) connexion.close()

Modifier des donnés

Exemple : modifier le prénom :

connexion = connexionBD() requete = "UPDATE eleve SET prenom='Paul' WHERE nom='Dupond' connexion.execute(requete) connexion.close()

Lire des données

Exemple : Liste des élèves :

connexion = connexionBD() resultat = connexion.execute("SELECT * FROM eleve") i = 1 for row in resultat: print("enregistrement " + str(i)) for champ in row: # Ecrit tous les champs de chaque ligne print ("Champ :" + str(champ)) i+=1 connexion.close()