Prérequis : requêtes de sélection SQL
À l’issue de ce chapitre, vous saurez :
- insérer des données dans une table avec
INSERT INTO ... VALUES; - modifier des données existantes avec
UPDATE ... SET ... WHERE; - supprimer des lignes avec
DELETE FROM ... WHERE; - créer et supprimer une table avec
CREATE TABLEetDROP TABLE; - interagir avec une base SQLite depuis Python grâce au module
sqlite3.
Insertion de données : INSERT
L’ordre INSERT INTO ajoute un nouveau tuple (une nouvelle ligne) dans une table.
Syntaxe générale :
INSERT INTO nom_table (attribut1, attribut2, ...)
VALUES (valeur1, valeur2, ...);
Exemple. Ajouter un nouveau produit dans la table Produits :
INSERT INTO Produits (id, nom, categorie, prix, stock)
VALUES (9, 'Règle 30 cm', 'Papeterie', 1.80, 120);
Les valeurs doivent respecter les types des attributs et les contraintes d’intégrité. Si l’id existe déjà ou si le prix est négatif (avec un CHECK), le SGBD refuse l’insertion.
Modification de données : UPDATE
L’ordre UPDATE modifie les valeurs d’un ou plusieurs attributs pour les lignes qui vérifient une condition.
Syntaxe générale :
UPDATE nom_table
SET attribut1 = nouvelle_valeur1, attribut2 = nouvelle_valeur2
WHERE condition;
Exemple. Le prix du Cahier A4 passe à 2.80 :
UPDATE Produits
SET prix = 2.80
WHERE nom = 'Cahier A4';
Attention. Sans clause WHERE, toutes les lignes de la table sont modifiées :
UPDATE Produits
SET stock = 0;
-- Met TOUT le stock à 0 ! Probablement pas souhaitable.
Suppression de données : DELETE
L’ordre DELETE supprime les lignes qui vérifient une condition.
Syntaxe générale :
DELETE FROM nom_table
WHERE condition;
Exemple. Supprimer les produits dont le stock est nul :
DELETE FROM Produits
WHERE stock = 0;
Attention. Sans clause WHERE, toutes les lignes sont supprimées (la table reste, mais vide).
La suppression peut être refusée si des lignes d’une autre table référencent la ligne à supprimer via une clé étrangère (contrainte de référence).
Création d’une table : CREATE TABLE
L’ordre CREATE TABLE définit la structure d’une nouvelle table : le nom de chaque attribut, son type et les contraintes associées.
CREATE TABLE Eleves (
id_eleve INT PRIMARY KEY,
nom TEXT NOT NULL,
prenom TEXT NOT NULL,
classe TEXT,
annee_naissance INT CHECK (annee_naissance >= 2000)
);
Types de données courants en SQLite
| Type | Description |
|---|---|
INT ou INTEGER | Entier |
REAL | Nombre à virgule flottante |
TEXT | Chaîne de caractères |
DATE | Date (stockée comme texte au format 'AAAA-MM-JJ' en SQLite) |
Déclarer les contraintes
Les contraintes vues dans le chapitre précédent
s’écrivent directement dans CREATE TABLE :
CREATE TABLE Emprunts (
id_emprunt INT PRIMARY KEY,
id_livre INT NOT NULL,
id_adherent INT NOT NULL,
date_emprunt TEXT NOT NULL,
date_retour TEXT,
FOREIGN KEY (id_livre) REFERENCES Livres(id_livre),
FOREIGN KEY (id_adherent) REFERENCES Adherents(id_adherent)
);
Suppression d’une table : DROP TABLE
DROP TABLE nom_table;
Cette opération est irréversible : la table et toutes ses données sont supprimées.
Interagir avec Python : le module sqlite3
Python intègre le module sqlite3 qui permet de manipuler une base de données SQLite sans installer de logiciel supplémentaire.
Se connecter à une base
import sqlite3
conn = sqlite3.connect("ma_base.db")
cursor = conn.cursor()
Si le fichier ma_base.db n’existe pas, il est créé automatiquement.
Exécuter des requêtes
# Créer une table
cursor.execute("""
CREATE TABLE IF NOT EXISTS Eleves (
id_eleve INTEGER PRIMARY KEY,
nom TEXT NOT NULL,
prenom TEXT NOT NULL,
classe TEXT
)
""")
# Insérer des données
cursor.execute("""
INSERT INTO Eleves (id_eleve, nom, prenom, classe)
VALUES (1, 'Dupont', 'Marie', 'Terminale A')
""")
# Valider les modifications
conn.commit()
L’appel à conn.commit() est indispensable pour enregistrer les modifications dans le fichier. Sans cet appel, les données sont perdues à la fermeture.
Récupérer les résultats
cursor.execute("SELECT nom, prenom FROM Eleves WHERE classe = 'Terminale A'")
resultats = cursor.fetchall()
for ligne in resultats:
print(ligne)
# ('Dupont', 'Marie')
cursor.fetchone()renvoie un seul tuple (la ligne suivante) ;cursor.fetchall()renvoie une liste de tous les tuples.
Fermer la connexion
conn.close()
Cela libère les ressources et finalise les opérations en cours.
Vérifiez votre compréhension
- Quelle est la différence entre
INSERTetUPDATE?Réponse
INSERTajoute une nouvelle ligne dans la table.UPDATEmodifie les valeurs d'une ou plusieurs lignes existantes.INSERTcrée un nouveau tuple,UPDATEchange un tuple déjà présent. - Que se passe-t-il si on écrit
DELETE FROM Produits;sans clauseWHERE?Réponse
Toutes les lignes de la table Produits sont supprimées. La table existe toujours (sa structure est conservée), mais elle est vide. C'est pourquoi il faut toujours vérifier la clauseWHEREavant d'exécuter unDELETE. - Pourquoi faut-il appeler
conn.commit()en Python après unINSERT?Réponse
Sansconn.commit(), les modifications restent en mémoire mais ne sont pas écrites dans le fichier de la base de données. Si on ferme la connexion sans commit, les données insérées sont perdues.
INSERT INTO ... VALUESajoute de nouvelles lignes dans une table.UPDATE ... SET ... WHEREmodifie des valeurs existantes (attention sansWHERE: toutes les lignes sont modifiées).DELETE FROM ... WHEREsupprime des lignes (attention sansWHERE: toutes les lignes sont supprimées).CREATE TABLEdéfinit la structure d’une table avec ses types et contraintes ;DROP TABLEla supprime définitivement.- En Python, le module
sqlite3permet de se connecter à une base, d’exécuter des requêtes aveccursor.execute(), de récupérer les résultats avecfetchall(), et d’enregistrer les modifications avecconn.commit().