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)
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.
try: # Bloc à essayer except: # Bloc qui sera exécuté en cas d'erreur
#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.
help ('mysql.connector')
help ('mysql.connector.errorcode')
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().
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
cursor.close() #Fermeture du curseur connexion.close() #Deconnexion de la base
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)
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()
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()
Exemple : modifier le prénom :
connexion = connexionBD() requete = "UPDATE eleve SET prenom='Paul' WHERE nom='Dupond' connexion.execute(requete) connexion.close()
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()