Achref El Mouelhi
elmouelhi.achref@gmail.com
1 Introduction
2 Téléchargement et installation
3 Avant de commencer
4 Utilisation
5 Restructuration du code
Python
Python
Python
Téléchargement et installation
Python
Démarche
I c
ELH
Créez un répertoire cours-python-mysql dans votre espace
U
MO
de travail
f E L
Lancez VSC et allez dans File > Open Folder... et
c hre
choisissez cours-python-mysql
A
c
Dans cours-python-mysql, créez un fichier main.py
Python
Voici le script SQL qui permet de créer la base de données utilisée dans ce
cours
USE courspython;
I c
E LH
CREATE TABLE personne(
num INT PRIMARY KEY AUTO_INCREMENT, OU
L M
nom VARCHAR(30),
prenom VARCHAR(30)
ref E
);
c h
c A
SHOW TABLES;
Python
Quatre étapes
I c
éesL
Établir la connexion avec la base de donnE H
O U
Créer et exécuter des requêtes M
fE L SQL
h r
Récupérer le résultate
Fermer
Ac
cla connexion
Python
I c
le nom de l’hôte sur lequel le serveur MySQL est installé (dans
notre cas localhost ou 127.0.0.1)
EL H
U
Odéfaut 3306 ou 3308)
le port TCP/IP utilisé par MySQL
L M(par
le nom de la base de
h r e f Eées MySQL
donn
le nom
Ac (par défaut root pour MySQL)
cd’utilisateur
le mot de passe
Python
I c
ELH
U
L MO
f E
chre
c A
Python
I c
H
ELées
U
Établissons la connexion avec la base de donn
L MO
host="localhost",
h r fE
connexion = mysql.connector.connect(
e
user="root", A c
c
password="",
database="courspython",
port=3308
)
Python
Créons la requête
I c
ELH
U
L MO
f E
chre
c A
Python
Créons la requête
I c
ELH
Exécutons la requête
U
L MO
curseur = connexion.cursor()
f E
hre
curseur.execute(request)
c
c A
Python
Créons la requête
I c
ELH
Exécutons la requête
U
L MO
curseur = connexion.cursor()
f E
hre
curseur.execute(request)
c
c A
Récupérons le résultat
personnes = curseur.fetchall()
Python
Affichons le résultat
for personne in personnes:
print(personne)
I c
# résultat ELH
U
# (1, ’Wick’, ’John’)
L MO
# (2, ’Dalton’, ’Jack’)
f E
chre
c A
Python
Affichons le résultat
for personne in personnes:
print(personne)
I c
# résultat ELH
U
# (1, ’Wick’, ’John’)
L MO
# (2, ’Dalton’, ’Jack’)
f E
A c hre
c
Et enfin fermons la connexion
connexion.close()
curseur.close()
Python
Les instructions d’accès aux données peuvent lever une exception. Ajoutons donc try ... except ... finally
import mysql.connector
from mysql.connector import Error
try:
connexion = mysql.connector.connect(
host="localhost",
user="root",
I c
password="",
database="courspython",
ELH
port=3308
U
MO
)
request = "SELECT * FROM Personne"
curseur = connexion.cursor()
f E L
hre
curseur.execute(request)
c
c A
personnes = curseur.fetchall()
for personne in personnes:
print(personne)
except Error as e:
print("Exception : ", e)
finally:
if (connexion.is_connected()):
connexion.close()
curseur.close()
print("La connexion à MySQL est désormais fermée")
Python
I c
for personne in personnes:
print(personne[1], personne[2]) ELH
U
L MO
# affiche
f E
# Wick John
chre
#
#
Dalton Jack
c A
La connexion à MySQL est désormais fermée
Python
Les instructions d’accès aux données peuvent lever une exception. Ajoutons donc try ... except ... finally
import mysql.connector
from mysql.connector import Error
try:
connexion = mysql.connector.connect(
host="localhost",
user="root",
I c
password="",
database="courspython",
ELH
port=3308
U
MO
)
request = "SELECT * FROM Personne"
f E L
curseur = connexion.cursor(dictionary=True)
hre
curseur.execute(request)
c
c A
personnes = curseur.fetchall()
for personne in personnes:
print(personne[’prenom’], personne[’nom’])
except Error as e:
print("Exception : ", e)
finally:
if (connexion.is_connected()):
connexion.close()
curseur.close()
print("La connexion à MySQL est désormais fermée")
Python
# affichec A
# Wick John
Python
Python
Pour récupérer un tuple selon la valeur d’une colonne (num = 2
par exemple)
request = "SELECT * FROM Personne WHERE num = 2"
I c
curseur = connexion.cursor()
ELH
U
curseur.execute(request)
L MO
re f E
c h
personne = curseur.fetchone()
c A
print(personne[1], personne[2])
# affiche
# Dalton Jack
Python
Ou en utilisant les requêtes paramétrées
request = "SELECT * FROM Personne WHERE num = %s"
curseur = connexion.cursor()
I c
ELH
# virgule obligatoire
U
tuple = (2,)
L MO
curseur.execute(request, tuple)
f E
chre
c A
personne = curseur.fetchone()
print(personne[1], personne[2])
# affiche
# Dalton Jack
Python
Pour sélectionner seulement quelques champs d’un tuple
request = "SELECT nom FROM Personne WHERE num = %s"
curseur = connexion.cursor()
I c
ELH
# virgule obligatoire
U
tuple = (2,)
L MO
curseur.execute(request, tuple)
f E
chre
c A
nom = curseur.fetchone()
print(nom[0])
# affiche
# Dalton
Python
Python
I
c
Remarques
H
L valider la requête
Epour
O
connexion.commit() est indispensable U
L M
f Epeut utiliser
Pour annuler la requête, on
r e
ch
connexion.rollback()
A
c
Python
Python
c A
connexion.commit()
print(curseur.rowcount, "tuple(s) inséré(s) avec succès
dans la table personne", curseur.lastrowid)
Python
I c
EL H
Exercice
U
L MetODELETE.
Pour terminer le CRUD, faites UPDATE
h r e fE
A c
c
Python
Organisation du code
cours-python-mysql
src
config
init .py
c
myconnection.py
I
ELH config.json
U config.py
MO
dao
f EL init .py
chre dao.py
c A
model
personnedao.py
init .py
personne.py
main.py
Arborescence du projet ( init .py n’est plus nécessaire depuis Python 3.3)
Python
Le fichier config.json
{
I c
"mysql": {
ELH
"host": "localhost",
U
"user": "root",
L MO
"password": "",
f E
chre
"db": "courspython",
}
c A
"port": 3308
Python
Python
La classe MyConnection
class MyConnection:
I c
__connection = None
ELH
__cursor = None
U
def __init__(self):
L MO
E
__db_config = config[’mysql’]
f
hre
self.__connection = pymysql.connect(host=__db_config[’host’],
user = __db_config[’user’],
c password = __db_config[’password’],
c A
db = __db_config[’db’],
port=__db_config[’port’])
self.__cursor = self.__connection.cursor()
def close(self):
self.__connection.close()
class Personne:
def __init__(self, num: int = 0, nom: str = ’’, prenom: str = ’’):
self._num = num
self._nom = nom
self._prenom = prenom
@property
def num(self) -> int:
return self._num
@num.setter
I c
H
def num(self, num) -> None:
EL
if num > 0:
self._num = num
U
MO
else:
self._num = 0
@property
def nom(self) -> str:
f E L
hre
return self._nom
@nom.setter
c
c A
def nom(self, nom) -> None:
self._nom = nom
@property
def prenom(self) -> str:
return self._prenom
@prenom.setter
def prenom(self, prenom) -> None:
self._prenom = prenom
@prenom.deleter
def prenom(self) -> str:
del self._prenom
def __str__(self) -> str:
return str(self._num) + " " + self._prenom + " " + self._nom
Python
La classe abstraite Dao
from typing import TypeVar, Generic, Iterable
from abc import ABC, abstractmethod
T = TypeVar(’T’)
I c
class Dao (Generic[T], ABC):
@abstractmethod
ELH
U
MO
def save(self, t: T) -> T:
pass
@abstractmethod
f E L
hre
def findAll(self) -> Iterable:
pass
c
c A
@abstractmethod
def findById(self, t: int) -> T:
pass
@abstractmethod
def update(self, t: T) -> T:
pass
@abstractmethod
def remove(self, t: T) -> None:
pass
I c
def __init__(self):
self.__db = MyConnection()
ELH
U
def findAll(self):
L MO
f E
return self.__db.query("SELECT * FROM personne", None).fetchall
hre
()
c
c A
def save(self, personne: Personne) -> Personne:
pass
def findById(self, t: int) -> Personne:
pass
def update(self, t: Personne) -> Personne:
pass
def remove(self, t: Personne) -> None:
pass
Python
except Error as e:
print("Exception : ", e)
Python
I
c
Remarque
EL H
U
Oautres méthodes de la classe
M
N’oublions pas d’implémenter les quatre
L
abstraite Dao
h r e fE
A c
c