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