Python et bases de données Khalid HOUSNI Une base de données c'est quoi? Une base de données (database en anglais) est un conteneur dans lequel il est possible de stocker des données de façon structurée Un langage standardisé -SQL- est dédié à cette structure et permet aussi bien de faire des recherches mais aussi des modifications ou des suppressions. Les logiciels de gestion de bases de données les plus utilisées aujourd'hui sont des SGBDR -Système de gestion de base de données relationnelles-, c'est à dire que les données sont liées les unes aux autres, par exemple on peut définir que si on supprime une information, d'autres informations dépendantes de cette dernière soient elles-aussi automatiquement supprimées. Cela garantit une cohérence de données. Il ne faut donc pas confondre une base de données qui est un conteneur et le SGBDR qui est un logiciel de gestion de bases de données. SQLite Utiliser le module SQLite Pour importer le module SQLite: import sqlite3 Créer une base de données avec SQLite Le paquet sqlite3 contient la méthode sqlite3.connect qui offre tous les services de connections une base de données Sqlite conn = sqlite3.connect('ma_base.db') Lorsque vous exécuterez votre programme vous remarquerez que si la base n'existe pas encore, un fichier sera crée dans le dossier de votre programme. Et si celui-ci existe déjà il sera réutilisé. Il est également possible de travailler avec une base de données de manière temporaire: conn = sqlite3.connect(':memory:') Pour fermer la connexion à la base de données on utilise : conn.close() Créer une table avec SQLite cursor = conn.cursor() cursor.execute(""" CREATE TABLE IF NOT EXISTS users( id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, name TEXT, age INTERGER ) """) conn.commit() TEXT : enregistre la donnée comme une chaine de caractères, sans limite de taille. Si un nombre est entré dans une colonne de ce type, il sera automatiquement converti en une chaine de caractères ; NUMERIC : tente d'enregistrer la donnée comme un entier ou comme un réel, mais si cela s'avère impossible, la donnée sera enregistrée comme une chaine de caractères ; INTEGER : enregistre la donnée comme un entier si celle-ci peut être encodée sans perte, mais peut utiliser les types REAL ou TEXT si ça ne peut être fait ; REAL : enregistre la donnée comme un réel, même s'il s'agit d'un entier. Si la valeur est trop grande, la donnée sera convertie en chaine de caractères ; NONE : la donnée est enregistrée telle quelle, sans conversion. Supprimer une table avec SQLite: cursor = conn.cursor() cursor.execute(""" DROP TABLE users """) conn.commit() Insérer des données cursor.execute(""" INSERT INTO users(name, age) VALUES(?, ?) """, (“Housni", 36)) Vous pouvez passer par un dictionnaire: data = {"name" : “Housni", "age" : 36} cursor.execute(""" INSERT INTO users(name, age) VALUES(:name, :age)""", data) Insérer des données dans une table avec SQLit Vous pouvez récupérer l'id de la ligne que vous venez d'insérer de cette manière: id = cursor.lastrowid Il est également possible de faire plusieurs insert en une seule fois avec la fonction executemany: users = [] users.append(("Housni", 36)) users.append((" Ayoubi", 60)) cursor.executemany(""" INSERT INTO users(name, age) VALUES(?, ?)""", users) Récupérer des données Vous pouvez récupérer la première ligne correspondant à votre recherche à l'aide de la fonction fetchone. cursor.execute("""SELECT name, age FROM users""") user1 = cursor.fetchone() print(user1) # (‘Housni', 36) Vous pouvez récupérer plusieurs données de la même recherche en utilisant la fonction fetchall(). cursor.execute("""SELECT id, name, age FROM users""") rows = cursor.fetchall() for row in rows: print('{0} : {1} - {2}'.format(row[0], row[1], row[2])) Récupérer des données L'objet curseur fonctionne comme un itérateur, invoquant la méthode fetchall() automatiquement: cursor.execute("""SELECT id, name, age FROM users""") for row in cursor: print('{0} : {1}, {2}'.format(row[0], row[1], row[2])) Pour la recherche spécifique,on utilise la même logique vu précédemment: id = 2 cursor.execute("""SELECT id, name FROM users WHERE id=?""", (id,)) response = cursor.fetchone() Mettre à jour et supprimer des enregistrements Pour modifier des entrées on utilise la syntaxe suivante: cursor.execute("""UPDATE users SET age = ? WHERE id = ?""", (20,3)) Pour supprimer un enregistrement dans une table on utilise : cursor.execute('''DELETE FROM users WHERE id = 2 ;''') MySQL MySQL est le logiciel idéal pour vos projets de sites web. Contrairement à SQLite, il est nécessaire de l'installer et de le configurer. Il faut d’abord installer mysql-connector package ou pymysql qui remplace cette dernière. Pour cela on utilise l’instruction suivante: pip install pymysql Pour la mise à jour de la commande pip on utilise pip install --upgrade pip Connexion avec une base de données MySql voici l'exemple de connexion avec la base de données MySQL "TESTDB« import pymysql # Open database connection db = pymysql .connect("localhost","root","","TESTDB" ) # prepare a cursor object using cursor() method cursor = db.cursor() # execute SQL query using execute() method. cursor.execute("SELECT VERSION()") # Extraire une seule ligne à l'aide de la méthode fetchone (). data = cursor.fetchone() print ("Database version : %s " % data) db.close() # disconnect from server Création d'une table dans MySql import pymysql # Open database connection db = pymysql.connect("localhost","root","","TESTDB" ) # prepare a cursor object using cursor() method cursor = db.cursor() # Drop table if it already exist using execute() method. cursor.execute("DROP TABLE IF EXISTS EMPLOYEE") # Create table as per requirement sql = """CREATE TABLE EMPLOYEE ( FIRST_NAME CHAR(20) NOT NULL, LAST_NAME CHAR(20), AGE INT, SEX CHAR(1), INCOME FLOAT )""" # REVENU cursor.execute(sql) db.commit() # disconnect from server db.close() L’opération commit() et rollback() Commit est l'opération, qui donne un signal vert à la base de données pour finaliser les changements, et après cette opération, aucun changement ne peut être renvoyé. Si vous n'êtes pas satisfait d'un ou de plusieurs des changements et que vous souhaitez rétablir ces modifications complètement, utilisez la méthode rollback(). Opération d’insertion import pymysql # Open database connection db = pymysql.connect("localhost","root","","TESTDB" ) # prepare a cursor object using cursor() method cursor = db.cursor() sql = """INSERT INTO EMPLOYEE( FIRST_NAME, LAST_NAME, AGE, SEX, INCOME) VALUES (‘Yazidi', ‘Abdelwahid', 26, 'M', 7000)""" cursor.execute(sql) db.commit() # disconnect from server db.close() L'exemple ci-dessus peut être écrit comme suit pour créer des requêtes SQL dynamique import pymysql # Open database connection db = pymysql.connect("localhost","root","","TESTDB" ) # prepare a cursor object using cursor() method cursor = db.cursor() sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \ LAST_NAME, AGE, SEX, INCOME) \ VALUES ('%s', '%s', '%d', '%c', '%d' )" % \ (‘Yazidi', ‘Abdelwahid', 26, 'M', 7000) cursor.execute(sql) db.commit() # disconnect from server db.close() L’opération de lecture d’une base de données Une fois que notre connexion à la base de données est établie, vous êtes prêt à effectuer une requête dans cette base de données.Vous pouvez utiliser la méthode fetchone () pour extraire une valeur unique ou fetchall () pour extraire plusieurs valeurs d'une table de base de données. fetchone (): Il récupère la ligne suivante d'un ensemble de résultats de requête. Un ensemble de résultats est un objet renvoyé lorsqu'un objet curseur est utilisé pour interroger une table. fetchall (): Il récupère toutes les lignes d'un jeu de résultats. Si certaines lignes ont déjà été extraites du jeu de résultats, elles récupèrent les lignes restantes du jeu de résultats. rowcount: Il s'agit d'un attribut en lecture seule et renvoie le nombre de lignes affectées par une méthode execute (). Exemple de section de données sql = "SELECT * FROM EMPLOYEE \ WHERE INCOME > '%d'" % (1000) try: # Execute the SQL command cursor.execute(sql) # Fetch all the rows in a list of lists. results = cursor.fetchall() for row in results: fname = row[0] lname = row[1] age = row[2] sex = row[3] income = row[4] # Now print fetched result print ("fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \ (fname, lname, age, sex, income )) except: print ("Error: unable to fecth data") L’opération de mise à jour # Prepare SQL query to UPDATE required records sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M') try: # Execute the SQL command cursor.execute(sql) # Commit your changes in the database db.commit() except: # Rollback in case there is any error db.rollback() L’opération de suppression sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20) try: # Execute the SQL command cursor.execute(sql) # Commit your changes in the database db.commit() except: # Rollback in case there is any error db.rollback() Bibliographie http://apprendre-python.com/page-database-data-basedonnees-query-sql-mysql-postgre-sqlite https://www.tutorialspoint.com/python3/python_database _access.htm