Table des matières

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()