Pour effectuer une requête DELETE par programmation, il faut trouver un moyen de permettre à SQLite de retrouve le ou les enregistrements qu'il doit supprimer.
Dans une application console, si on désire permettre à l'usager de supprimer un enregistrement précis, il est intéressaant d'afficher la liste des enregistrements en s'assurant qu'une des informations affichées permet d'identifier chaque enregistrement de façon unique, par exemple :
Si la table contient un champ créé avec la clause UNIQUE, il sera facile de déterminer quel enregistrement doit être supprimé.
Ex :
# dans cette BD, le champ code est unique
requete = 'SELECT code, description FROM cours ORDER BY code'
curseur.execute(requete)
resultat = curseur.fetchall()
for enreg in resultat:
print(enreg)
...
code = input('Veuillez entrer le code du cours à supprimer : ')
Le visuel n'est pas très intéressant, mais c'est fonctionnel :
Pour améliorer l'apparence, ajoutons une ligne d'entête puis affichons le contenu des champs plutôt que l'enregistrement brut :
Ex :
print('Code Titre')
for enreg in resultat:
print(enreg[0] + ' ' + enreg[1])
Beaucoup mieux :
Il sera alors possible de supprimer l'enregistrement avec une requête du genre :
requete = 'DELETE FROM cours WHERE code = ?'
curseur.execute(requete, (code,))
Dans le cas où la table ne contient pas de champ unique, il faudra travailler avec un numéro séquentiel.
Un identifiant numérique autoincrémenté ne peut pas être utilisé puisque, premièrement, on voudra afficher les enregistrements en ordre alphabétique ou dans un autre ordre qui fait du sens pour l'usager. De plus, il se peut qu'il y ait des trous dans la séquence des identifiants, par exemple, lorsqu'un enregistrement a été supprimé. L'usager ne comprendrait pas pourquoi il manque des numéros.
Voici donc comment travailler avec un numéro séquentiel.
Important : la requête doit aller chercher l'identifiant, même s'il n'est pas affiché. Le programme retrouvera l'identifiant à partir du numéro séquentiel puis s'en servira pour supprimer l'enregistrement.
Ex :
requete = 'SELECT id, nom FROM etablissements ORDER BY nom'
curseur.execute(requete)
resultat = curseur.fetchall()
i = 1
for enreg in resultat:
print(str(i) + ' ' + enreg[1])
i = i+1
...
numero = input('Veuillez entrer le numéro de l\'établissement à supprimer : ')
...
try:
indice = int(numero) - 1
id = resultat[indice][0]
continuer = True
except:
print('Un problème empêche de retrouver l\'établissement correspondant à ce numéro. Avez-vous entré un numéro valide ?')
continuer = False
traceback.print_exc(file=sys.stdout)
if continuer:
...
Ce programme ressemblera à ceci :
Voici quelques explications pour vous aider à comprendre comment l'identifiant est retrouvé à partir du numéro saisi.
Tout d'abord, le contenu de la variable resultat est toujours un tableau à deux dimensions ou, plus précisément, une liste de tuples.
Si on fait afficher sa valeur dans le débogueur, on voit que le premier élément de la liste, aussi appelé resultat[0], contient le tuple (2, 'Cégep de Ste-Foy').
Pour accéder à la valeur de l'identifiant de cet élément, on doit retrouver le premier élément du tuple. Ceci est possible par ce code : resultat[0][0].
Dans le programme, l'indice du premier crochet sera initialisé à partir du numéro saisi par l'usager (c'est lui qui indique sur quel enregistrement on veut travailler). Le second crochet carré contiendra toujours la valeur 0 puisqu'on voudra toujours obtenir l'identifiant.
Si l'usager a entré la valeur 1, c'est qu'il désire supprimer le premier enregistrement, dont l'indice est zéro. Il faudra donc soustraire 1 de la valeur saisie.
Et puisqu'une valeur saisie est toujours sous forme de chaîne, il faut d'abord la convertir en entier.
Au résultat, on obtiendra :
indice = int(numero) - 1
id = resultat[indice][0]
ou, si vous préférez :
id = resultat[int(numero) - 1][0]
Il sera alors possible de supprimer l'enregistrement avec une requête du genre :
requete = 'DELETE FROM etablissements WHERE id = ?'
curseur.execute(requete, (id,))
▼Publicité