Persistance des données Python - Module Sqlite3

Un inconvénient majeur des fichiers CSV, JSON, XML, etc. est qu'ils ne sont pas très utiles pour l'accès aléatoire et le traitement des transactions car ils sont en grande partie non structurés. Par conséquent, il devient très difficile de modifier le contenu.

Ces fichiers plats ne conviennent pas à l'environnement client-serveur car ils ne disposent pas de capacité de traitement asynchrone. L'utilisation de fichiers de données non structurés entraîne une redondance et une incohérence des données.

Ces problèmes peuvent être surmontés en utilisant une base de données relationnelle. Une base de données est une collection organisée de données pour éliminer la redondance et les incohérences et maintenir l'intégrité des données. Le modèle de base de données relationnelle est très populaire.

Son concept de base est d'organiser les données dans une table d'entité (appelée relation). La structure de la table d'entités fournit un attribut dont la valeur est unique pour chaque ligne. Un tel attribut est appelé'primary key'.

Lorsque la clé primaire d'une table apparaît dans la structure d'autres tables, elle est appelée 'Foreign key'et cela forme la base de la relation entre les deux. Sur la base de ce modèle, de nombreux produits SGBDR populaires sont actuellement disponibles -

  • GadFly
  • mSQL
  • MySQL
  • PostgreSQL
  • Microsoft SQL Server 2000
  • Informix
  • Interbase
  • Oracle
  • Sybase
  • SQLite

SQLite est une base de données relationnelle légère utilisée dans une grande variété d'applications. Il s'agit d'un moteur de base de données SQL transactionnel autonome, sans serveur et sans configuration. La base de données entière est un fichier unique, qui peut être placé n'importe où dans le système de fichiers. C'est un logiciel open source, avec un très faible encombrement et une configuration nulle. Il est couramment utilisé dans les appareils intégrés, l'IOT et les applications mobiles.

Toutes les bases de données relationnelles utilisent SQL pour gérer les données dans les tables. Cependant, auparavant, chacune de ces bases de données était connectée à l'application Python à l'aide du module Python spécifique au type de base de données.

Par conséquent, il y avait un manque de compatibilité entre eux. Si un utilisateur voulait changer de produit de base de données, cela s'avérerait difficile. Ce problème d'incompatibilité a été résolu en lançant «Python Enhancement Proposition (PEP 248)» pour recommander une interface cohérente avec les bases de données relationnelles connues sous le nom de DB-API. Les dernières recommandations sont appeléesDB-APIVersion 2.0. (PEP 249)

La bibliothèque standard de Python se compose du module sqlite3 qui est un module compatible DB-API pour gérer la base de données SQLite via le programme Python. Ce chapitre explique la connectivité de Python avec la base de données SQLite.

Comme mentionné précédemment, Python a un support intégré pour la base de données SQLite sous la forme d'un module sqlite3. Pour les autres bases de données, le module Python compatible DB-API respectif devra être installé à l'aide de l'utilitaire pip. Par exemple, pour utiliser la base de données MySQL, nous devons installer le module PyMySQL.

pip install pymysql

Les étapes suivantes sont recommandées dans DB-API -

  • Établissez la connexion avec la base de données en utilisant connect() fonction et obtenir l'objet de connexion.

  • Appel cursor() méthode d'objet de connexion pour obtenir un objet curseur.

  • Formez une chaîne de requête composée d'une instruction SQL à exécuter.

  • Exécutez la requête souhaitée en appelant execute() méthode.

  • Fermez la connexion.

import sqlite3
db=sqlite3.connect('test.db')

Ici, db est l'objet de connexion représentant test.db. Notez que cette base de données sera créée si elle n'existe pas déjà. L'objet de connexion db a les méthodes suivantes -

N ° Sr. Méthodes et description
1

cursor():

Renvoie un objet Cursor qui utilise cette connexion.

2

commit():

Valide explicitement toutes les transactions en attente dans la base de données.

3

rollback():

Cette méthode facultative entraîne la restauration d'une transaction au point de départ.

4

close():

Ferme définitivement la connexion à la base de données.

Un curseur agit comme un handle pour une requête SQL donnée permettant la récupération d'une ou plusieurs lignes du résultat. L'objet curseur est obtenu à partir de la connexion pour exécuter des requêtes SQL à l'aide de l'instruction suivante -

cur=db.cursor()

L'objet curseur a les méthodes suivantes définies -

Sr. Non Méthodes et description
1

execute()

Exécute la requête SQL dans un paramètre de chaîne.

2

executemany()

Exécute la requête SQL à l'aide d'un ensemble de paramètres dans la liste des tuples.

3

fetchone()

Récupère la ligne suivante du jeu de résultats de la requête.

4

fetchall()

Récupère toutes les lignes restantes de l'ensemble de résultats de la requête.

5

callproc()

Appelle une procédure stockée.

6

close()

Ferme l'objet curseur.

Le code suivant crée une table dans test.db: -

import sqlite3
db=sqlite3.connect('test.db')
cur =db.cursor()
cur.execute('''CREATE TABLE student (
StudentID INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT (20) NOT NULL,
age INTEGER,
marks REAL);''')
print ('table created successfully')
db.close()

L'intégrité des données souhaitée dans une base de données est obtenue par commit() et rollback()méthodes de l'objet de connexion. La chaîne de requête SQL peut avoir une requête SQL incorrecte qui peut déclencher une exception, qui doit être correctement gérée. Pour cela, l'instruction execute () est placée dans le bloc try. Si elle réussit, le résultat est sauvegardé en permanence à l'aide de la méthode commit (). Si la requête échoue, la transaction est annulée à l'aide de la méthode rollback ().

Le code suivant exécute la requête INSERT sur la table student dans test.db.

import sqlite3
db=sqlite3.connect('test.db')
qry="insert into student (name, age, marks) values('Abbas', 20, 80);"
try:
   cur=db.cursor()
   cur.execute(qry)
   db.commit()
print ("record added successfully")
except:
   print ("error in query")
   db.rollback()
db.close()

Si vous souhaitez que les données de la clause values ​​de la requête INSERT soient fournies dynamiquement par l'entrée utilisateur, utilisez la substitution de paramètres comme recommandé dans Python DB-API. Le ? character est utilisé comme espace réservé dans la chaîne de requête et fournit les valeurs sous la forme d'un tuple dans la méthode execute (). L'exemple suivant insère un enregistrement à l'aide de la méthode de substitution de paramètre. Le nom, l'âge et les notes sont pris en compte.

import sqlite3
db=sqlite3.connect('test.db')
nm=input('enter name')
a=int(input('enter age'))
m=int(input('enter marks'))
qry="insert into student (name, age, marks) values(?,?,?);"
try:
   cur=db.cursor()
   cur.execute(qry, (nm,a,m))
   db.commit()
   print ("one record added successfully")
except:
   print("error in operation")
   db.rollback()
db.close()

Le module sqlite3 définit le executemany()méthode qui est capable d'ajouter plusieurs enregistrements à la fois. Les données à ajouter doivent être données dans une liste de tuples, chaque tuple contenant un enregistrement. L'objet list est le paramètre de la méthode executemany (), avec la chaîne de requête. Cependant, la méthode executemany () n'est pas prise en charge par certains des autres modules.

le UPDATELa requête contient généralement une expression logique spécifiée par la clause WHERE. La chaîne de requête de la méthode execute () doit contenir une syntaxe de requête UPDATE. Pour mettre à jour la valeur de 'age' à 23 pour name = 'Anil', définissez la chaîne comme ci-dessous:

qry="update student set age=23 where name='Anil';"

Pour rendre le processus de mise à jour plus dynamique, nous utilisons la méthode de substitution de paramètres décrite ci-dessus.

import sqlite3
db=sqlite3.connect('test.db')
nm=input(‘enter name’)
a=int(input(‘enter age’))
qry="update student set age=? where name=?;"
try:
   cur=db.cursor()
   cur.execute(qry, (a, nm))
   db.commit()
   print("record updated successfully")
except:
   print("error in query")
   db.rollback()
db.close()

De même, l'opération DELETE est effectuée en appelant la méthode execute () avec une chaîne ayant la syntaxe de requête DELETE de SQL. Incidemment,DELETE La requête contient également généralement un WHERE clause.

import sqlite3
db=sqlite3.connect('test.db')
nm=input(‘enter name’)
qry="DELETE from student where name=?;"
try:
   cur=db.cursor()
   cur.execute(qry, (nm,))
   db.commit()
   print("record deleted successfully")
except:
   print("error in operation")
   db.rollback()
db.close()

L'une des opérations importantes sur une table de base de données est la récupération des enregistrements à partir de celle-ci. SQL fournitSELECTrequête pour le but. Lorsqu'une chaîne contenant la syntaxe de requête SELECT est donnée à la méthode execute (), un objet d'ensemble de résultats est renvoyé. Il existe deux méthodes importantes avec un objet curseur à l'aide desquelles un ou plusieurs enregistrements du jeu de résultats peuvent être récupérés.

fetchone ()

Récupère le prochain enregistrement disponible de l'ensemble de résultats. Il s'agit d'un tuple composé des valeurs de chaque colonne de l'enregistrement extrait.

fetchall ()

Récupère tous les enregistrements restants sous la forme d'une liste de tuples. Chaque tuple correspond à un enregistrement et contient les valeurs de chaque colonne de la table.

L'exemple suivant répertorie tous les enregistrements de la table Student

import sqlite3
db=sqlite3.connect('test.db')
37
sql="SELECT * from student;"
cur=db.cursor()
cur.execute(sql)
while True:
   record=cur.fetchone()
   if record==None:
      break
   print (record)
db.close()

Si vous prévoyez d'utiliser une base de données MySQL au lieu d'une base de données SQLite, vous devez installer PyMySQLmodule comme décrit ci-dessus. Toutes les étapes du processus de connectivité de la base de données étant identiques, puisque la base de données MySQL est installée sur un serveur, la fonction connect () a besoin de l'URL et des informations de connexion.

import pymysql
con=pymysql.connect('localhost', 'root', '***')

La seule chose qui peut différer avec SQLite est les types de données spécifiques à MySQL. De même, toute base de données compatible ODBC peut être utilisée avec Python en installant le module pyodbc.