Accéder à une base de données avec Python
Pour créer une application utilisant une base de données, il faut utiliser un connecteur.
Les SGBD en fournissent pour de nombreux langages de programmation (par exemple : connecteurs pour le SGBD MySQL).
Voici les principaux concepts et objets qui entrent en jeu dans la manipulation d’une base de données à travers un connecteur :
Connecteur développé par MySQL
Bibliothèque mysql-connector-python :
pip install mysql-connector-python
Connexion au serveur MySQL
Supposons que nous souhaitions créer une nouvelle table « Produits » dans la base de donnée « magasin » située sur le serveur d’adresse « 192.168.125.2 ».
L’utilisateur « georges » possède tous les droits sur cette base de données, et peut s’y connecter avec le mot de passe « what-else? ».
Remarque, pour créer et gérer des utilisateurs sur un serveur MySQL, il est conseillé d’utiliser phpmyadmin.
import mysql.connector conn = mysql.connector.connect(host="192.168.125.2", user="georges", password="what-else?", database="magasin") cursor = conn.cursor() # Opérations à réaliser sur la base ... conn.close()
En pratique il est déconseillé d’accéder à une base de données distante (pas sur la même machine que l’application). Le nom d’hôte sera donc le plus souvent
localhost
.
Créer une table de données MySQL
Voici la table à créer :
Pour créer une table, on exécute la requête SQL CREATE TABLE :
cursor.execute(""" CREATE TABLE IF NOT EXISTS Produits ( ref int(6) NOT NULL, nom varchar(100) DEFAULT NULL, stock int(4) DEFAULT NULL, prix float(5,2) DEFAULT NULL, PRIMARY KEY(ref), CHECK (stock>=0) ); """)
Insérer des données
Pour insérer un enregistrement dans une table, on exécute la requête SQL INSERT INTO :
Il existe deux manières de le faire :
- A partir d’une liste ou d’un tuple :
reference = (554871, "Confiture de fraise 250g", 10, 4.8) cursor.execute("""INSERT INTO Produits (ref, nom, stock, prix) VALUES(%s, %s, %s, %s)""", reference)
- A partir d’un dictionnaire :
reference = {'ref': 543154, 'nom' : "Gelée de coing 300g", 'stock' : 5, 'prix' : 3.75} cursor.execute("""INSERT INTO Produits (ref, nom, stock, prix) VALUES(%(ref)d, "%(nom)s", %(stock)d, %(prix)f)""", reference)
Pour que les données soient effectivement sauvegardées dans la table, il faut avant de fermer la connexion « commettre » les modifications :
conn.commit()
Accéder à des données
Pour accéder aux données d’une base de données, on exécute une requête SELECT :
cursor.execute("""SELECT ref, nom, prix FROM Produits WHERE stock > %d """, (0, )) rows = cursor.fetchall() for row in rows: print('{0} : {1} - {2}'.format(row[0], row[1], row[2]))
Exemple de code complet
Le code suivant reprend l’ensemble des notions vues plus haut et permet en plus la gestion des erreurs (indispensable dans le cas où le programme sert de serveur HTML).
#!/usr/bin/env python # -*- coding: utf-8 -*- import mysql.connector import sys sql_create = """ CREATE TABLE IF NOT EXISTS Produits ( ref int(6) NOT NULL, nom varchar(100) DEFAULT NULL, stock int(4) DEFAULT NULL, prix float(5,2) DEFAULT NULL, PRIMARY KEY(ref), CHECK (stock>=0) ); """ try: conn = mysql.connector.connect(host="192.168.125.2", user="georges", password="what-else?", database="magasin") cursor = conn.cursor() cursor.execute(sql_create) try: reference = (554871, "Confiture de fraise 250g", 10, 4.8) cursor.execute("""INSERT INTO Produits (ref, nom, stock, prix) VALUES(%s, %s, %s, %s)""", reference) reference = {'ref': 543154, 'nom' : "Gelée de coing 300g", 'stock' : 5, 'prix' : 3.75} cursor.execute("""INSERT INTO Produits (ref, nom, stock, prix) VALUES(%(ref)d, "%(nom)s", %(stock)d, %(prix)f)""", reference) conn.commit() except: # En cas d'erreur on annule les modifications conn.rollback() cursor.execute("""SELECT ref, nom, prix FROM Produits WHERE stock > %d """, (0, )) rows = cursor.fetchall() for row in rows: print('{0} : {1} - {2}'.format(row[0], row[1], row[2])) except mysql.connector.errors.InterfaceError as e: print("Error %d: %s" % (e.args[0],e.args[1])) sys.exit(1) finally: # On ferme la connexion if conn: conn.close()
Connecteur pyMySQL
Bibliothèque pymysql :
pip install pymysql
…
Sources : http://apprendre-python.com/page-database-data-base-donnees-query-sql-mysql-postgre-sqlite