Introduction à SQLite et au module sqlite3
SQLite est un système de gestion de base de données relationnelle compact qui ne nécessite pas l'installation d'un serveur dédié, ce qui le rend idéal pour le développement de projets petits et moyens. En Python, la prise en charge de SQLite est assurée par le module intégré sqlite3, permettant de travailler avec des bases de données sans installer de bibliothèques supplémentaires.
Le module sqlite3 transforme la création et l'utilisation de bases de données en un processus aussi simple que la manipulation de fichiers classiques. Cette solution est particulièrement précieuse pour le prototypage, les systèmes embarqués, les applications de bureau et les projets éducatifs.
Installation et compatibilité
Le module sqlite3 est inclus dans la bibliothèque standard de Python depuis la version 2.5 et est disponible sans installation supplémentaire. Il assure une compatibilité totale avec les systèmes d'exploitation Windows, macOS et Linux, offrant une interface pour travailler avec SQLite version 3.
import sqlite3
Connexion à la base de données et création de la liaison
Création d'une base de données fichier
conn = sqlite3.connect('ma_base.db')
Lors de l'exécution de cette commande, la base de données est automatiquement créée si le fichier spécifié n'existe pas.
Création d'une base de données en mémoire
conn = sqlite3.connect(':memory:')
Cette option est particulièrement pratique pour les tests et les opérations temporaires.
Paramètres supplémentaires de connexion
conn = sqlite3.connect('database.db',
check_same_thread=False,
detect_types=sqlite3.PARSE_DECLTYPES)
Création de tables et gestion du schéma de données
Création de tables
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE utilisateurs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nom TEXT NOT NULL,
age INTEGER,
email TEXT UNIQUE,
date_creation TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
''')
conn.commit()
Types de données dans SQLite
SQLite prend en charge cinq types de données principaux :
- INTEGER - nombres entiers
- REAL - nombres à virgule flottante
- TEXT - chaînes de caractères
- BLOB - données binaires
- NULL - absence de valeur
SQLite utilise un typage dynamique, ce qui offre de la flexibilité mais nécessite une attention particulière lors de la manipulation des données.
Opérations CRUD (Create, Read, Update, Delete)
Insertion de données
# Insertion d'un seul enregistrement
cursor.execute("INSERT INTO utilisateurs (nom, age, email) VALUES (?, ?, ?)",
("Jean Dupont", 30, "jean@exemple.com"))
# Insertion de plusieurs enregistrements
donnees_utilisateurs = [
("Marie Martin", 25, "marie@exemple.com"),
("Pierre Lefevre", 35, "pierre@exemple.com"),
("Anne Dubois", 28, "anne@exemple.com")
]
cursor.executemany("INSERT INTO utilisateurs (nom, age, email) VALUES (?, ?, ?)", donnees_utilisateurs)
conn.commit()
Sélection de données
# Sélection de tous les enregistrements
cursor.execute("SELECT * FROM utilisateurs")
tous_utilisateurs = cursor.fetchall()
# Sélection avec condition
cursor.execute("SELECT nom, age FROM utilisateurs WHERE age > ?", (25,))
utilisateurs_adultes = cursor.fetchall()
# Sélection avec tri
cursor.execute("SELECT * FROM utilisateurs ORDER BY age DESC")
utilisateurs_tries = cursor.fetchall()
Mise à jour de données
cursor.execute("UPDATE utilisateurs SET age = ? WHERE nom = ?", (31, "Jean Dupont"))
conn.commit()
# Obtention du nombre de lignes modifiées
print(f"Lignes mises à jour : {cursor.rowcount}")
Suppression de données
cursor.execute("DELETE FROM utilisateurs WHERE nom = ?", ("Anne Dubois",))
conn.commit()
print(f"Lignes supprimées : {cursor.rowcount}")
Utilisation des transactions
Les transactions garantissent l'intégrité des données. Utilisez commit() pour valider les modifications et rollback() pour les annuler.
try:
cursor.execute("INSERT INTO utilisateurs (nom, age) VALUES ('Test', 20)")
conn.commit()
except Exception as e:
conn.rollback()
print(f"Erreur : {e}")
Intégration avec Pandas
Combinez SQLite et Pandas pour une analyse de données avancée :
import pandas as pd
# Lecture d'une table SQLite dans un DataFrame
df = pd.read_sql_query("SELECT * FROM utilisateurs", conn)
print(df.head())
# Écriture d'un DataFrame dans SQLite
df.to_sql('nouvelle_table', conn, if_exists='replace', index=False)
Optimisation et bonnes pratiques
- Utilisez des index pour accélérer les requêtes :
CREATE INDEX idx_nom ON utilisateurs(nom); - Fermez toujours la connexion avec
conn.close() - Utilisez des requêtes paramétrées pour éviter les injections SQL
- Activez le mode WAL pour de meilleures performances en écriture
Sauvegarde et restauration
# Sauvegarde
conn_backup = sqlite3.connect('sauvegarde.db')
conn.backup(conn_backup)
conn_backup.close()
# Restauration
conn_restore = sqlite3.connect('sauvegarde.db')
conn_restore.backup(conn)
conn_restore.close()