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

Vous aimerez aussi...

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *