Gestion des erreurs SQLite

SQLiteSQLiteBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire, vous apprendrez à gérer efficacement les erreurs dans les bases de données SQLite. L'objectif principal est de gérer les violations de contraintes lors des opérations INSERT en utilisant la clause ON CONFLICT.

Vous commencerez par créer une base de données et une table avec une contrainte UNIQUE. Ensuite, vous explorerez différentes actions qui peuvent être entreprises lorsqu'un conflit se produit, telles que ROLLBACK, ABORT, FAIL, IGNORE ou REPLACE, en utilisant spécifiquement ON CONFLICT IGNORE pour empêcher l'insertion lorsqu'une contrainte d'unicité (unique constraint) est violée. Le laboratoire vous guidera à travers des exemples pratiques d'insertion de données et de gestion des erreurs potentielles.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sqlite(("SQLite")) -.-> sqlite/SQLiteGroup(["SQLite"]) sqlite/SQLiteGroup -.-> sqlite/init_db("Create SQLite Database") sqlite/SQLiteGroup -.-> sqlite/make_table("Create New Table") sqlite/SQLiteGroup -.-> sqlite/add_row("Insert Single Row") sqlite/SQLiteGroup -.-> sqlite/add_rows("Insert Multiple Rows") sqlite/SQLiteGroup -.-> sqlite/start_trans("Begin New Transaction") sqlite/SQLiteGroup -.-> sqlite/undo_trans("Rollback Transaction") subgraph Lab Skills sqlite/init_db -.-> lab-552550{{"Gestion des erreurs SQLite"}} sqlite/make_table -.-> lab-552550{{"Gestion des erreurs SQLite"}} sqlite/add_row -.-> lab-552550{{"Gestion des erreurs SQLite"}} sqlite/add_rows -.-> lab-552550{{"Gestion des erreurs SQLite"}} sqlite/start_trans -.-> lab-552550{{"Gestion des erreurs SQLite"}} sqlite/undo_trans -.-> lab-552550{{"Gestion des erreurs SQLite"}} end

Créer une base de données SQLite et une table avec une contrainte UNIQUE

Dans cette étape, vous allez créer une base de données SQLite et une table avec une contrainte UNIQUE. Cette contrainte vous aidera à comprendre comment gérer les erreurs lors de l'insertion de données en double.

Tout d'abord, ouvrez votre terminal dans la VM LabEx. Votre chemin d'accès par défaut est /home/labex/project.

Maintenant, créons une base de données SQLite nommée my_database.db. Exécutez la commande suivante pour créer le fichier de base de données et ouvrir l'outil de ligne de commande SQLite :

sqlite3 my_database.db

Vous verrez une invite indiquant que vous êtes maintenant dans l'interpréteur (shell) SQLite :

SQLite version 3.x.x
Enter ".help" for usage hints.
sqlite>

Ensuite, créez une table nommée users pour stocker les informations des utilisateurs. Cette table aura trois colonnes : id, username et email. La colonne username aura une contrainte UNIQUE, ce qui signifie que chaque nom d'utilisateur (username) doit être unique dans la table. Entrez la commande SQL suivante à l'invite sqlite> et appuyez sur Entrée :

CREATE TABLE users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    username TEXT UNIQUE NOT NULL,
    email TEXT NOT NULL
);

Cette commande configure la table users où :

  • id est un entier qui augmente automatiquement pour chaque nouvelle entrée. La contrainte PRIMARY KEY garantit que chaque id est unique, et AUTOINCREMENT le fait augmenter automatiquement.
  • username est un champ texte qui ne peut pas être vide (NOT NULL) et doit être unique (UNIQUE).
  • email est également un champ texte qui ne peut pas être vide (NOT NULL).

Vous ne verrez aucune sortie si la commande s'exécute correctement.

Insérer des données dans la table

Maintenant que vous avez créé la table users, ajoutons-y des données. Nous allons insérer un enregistrement d'utilisateur (user record) dans la table.

Insérez un enregistrement d'utilisateur dans la table users en exécutant cette commande à l'invite sqlite> :

INSERT INTO users (username, email) VALUES ('Alice', '[email protected]');

Cette commande ajoute une ligne à la table users.

  • INSERT INTO users (username, email) spécifie que vous insérez des données dans les colonnes username et email de la table users.
  • VALUES ('Alice', '[email protected]') fournit les valeurs à insérer pour chaque enregistrement.

Pour confirmer que les données ont été ajoutées correctement, exécutez cette commande pour afficher tous les enregistrements de la table :

SELECT * FROM users;

Résultat attendu :

1|Alice|[email protected]

Cette sortie affiche l'id, le username et l'email de l'enregistrement. La commande SELECT * récupère toutes les colonnes de la table spécifiée.

Tentative d'insertion de données en double

Dans cette étape, vous allez tenter d'insérer un enregistrement avec un nom d'utilisateur (username) en double. Cela violera la contrainte UNIQUE et provoquera une erreur.

Exécutez la commande suivante à l'invite sqlite> :

INSERT INTO users (username, email) VALUES ('Alice', '[email protected]');

Vous verrez un message d'erreur similaire à celui-ci :

Error: UNIQUE constraint failed: users.username

Ce message d'erreur indique que la contrainte UNIQUE sur la colonne username a été violée. SQLite empêche l'insertion de noms d'utilisateur en double pour maintenir l'intégrité des données.

Utiliser ON CONFLICT IGNORE pour gérer les violations de contraintes

Dans cette étape, vous apprendrez à utiliser la clause ON CONFLICT IGNORE pour gérer les violations de contraintes. Cette clause indique à SQLite d'ignorer l'insertion si elle devait violer une contrainte.

Exécutez la commande suivante à l'invite sqlite> :

INSERT OR IGNORE INTO users (username, email) VALUES ('Alice', '[email protected]');

Cette commande tente d'insérer un nouvel enregistrement avec le nom d'utilisateur 'Alice'. Cependant, comme la clause ON CONFLICT IGNORE est utilisée, SQLite ignorera l'insertion et aucune erreur ne sera levée.

Pour confirmer que l'enregistrement en double n'a pas été inséré, exécutez cette commande :

SELECT * FROM users;

Résultat attendu :

1|Alice|[email protected]

Le résultat montre que seul l'enregistrement original avec le nom d'utilisateur 'Alice' existe dans la table. L'enregistrement en double a été ignoré.

L'instruction INSERT OR IGNORE fournit un moyen d'éviter les erreurs et de maintenir l'intégrité des données lors de l'insertion de données qui pourraient violer des contraintes.

Utiliser ON CONFLICT REPLACE pour gérer les violations de contraintes

Dans cette étape, vous apprendrez à utiliser la clause ON CONFLICT REPLACE pour gérer les violations de contraintes. Cette clause indique à SQLite de remplacer l'enregistrement existant par le nouvel enregistrement si celui-ci devait violer une contrainte.

Exécutez la commande suivante à l'invite sqlite> :

INSERT OR REPLACE INTO users (id, username, email) VALUES (1, 'Alice', '[email protected]');

Cette commande tente d'insérer un nouvel enregistrement avec le nom d'utilisateur 'Alice'. Étant donné que la clause ON CONFLICT REPLACE est utilisée, SQLite remplacera l'enregistrement existant par le nouvel enregistrement. Notez que nous devons spécifier l'id dans ce cas, car REPLACE supprimera l'ancienne ligne et en insérera une nouvelle.

Pour confirmer que l'enregistrement a été remplacé, exécutez cette commande :

SELECT * FROM users;

Résultat attendu :

1|Alice|[email protected]

Le résultat montre que l'adresse e-mail de l'enregistrement avec le nom d'utilisateur 'Alice' a été mise à jour vers [email protected].

L'instruction INSERT OR REPLACE fournit un moyen de mettre à jour les enregistrements existants tout en maintenant l'intégrité des données.

Enfin, quittez l'interpréteur (shell) SQLite :

.exit

Cela fermera la connexion à la base de données et vous ramènera au terminal.

Résumé

Dans ce labo, vous avez appris à gérer efficacement les erreurs dans les bases de données SQLite, en vous concentrant sur les violations de contraintes lors des opérations INSERT. Vous avez créé une base de données et une table avec une contrainte UNIQUE, inséré des données, puis tenté d'insérer des données en double pour déclencher une erreur. Vous avez ensuite exploré comment utiliser les clauses ON CONFLICT IGNORE et ON CONFLICT REPLACE pour gérer ces violations de contraintes, ce qui vous permet de contrôler la façon dont SQLite réagit aux erreurs potentielles et de maintenir l'intégrité des données.