Formation PUB400 : Python, 2018 Suppression de données

6.1 Choix de l'enregistrement à supprimer à la console


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 :

  • la clé primaire (à éviter, l'usager ne comprendra pas pourquoi les numéros ne se suivent pas...)
  • un champ qui a été créé avec la clause UNIQUE
  • un numéro séquentiel à partir duquel Python pourra retrouver l'identifiant de l'enregistrement à supprimer

Suppression à partir d'un champ unique

Si la table contient un champ créé avec la clause UNIQUE, il sera facile de déterminer quel enregistrement doit être supprimé.

Ex :

Python

# 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 :

Liste à la console

Pour améliorer l'apparence, ajoutons une ligne d'entête puis affichons le contenu des champs plutôt que l'enregistrement brut :

Ex :

Python

print('Code       Titre')

 

for enreg in resultat:

    print(enreg[0] + ' ' + enreg[1])

Beaucoup mieux :

Liste à la console

Il sera alors possible de supprimer l'enregistrement avec une requête du genre :

Python

requete = 'DELETE FROM cours WHERE code = ?'

curseur.execute(requete, (code,))

Suppression à partir d'un numéro séquentiel

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 :

Python

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 :

Liste à la console

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').

Contenu de la variable resultat

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].

  • Le premier crochet carré contient l'indice correspondant à l'enregistrement recherché.
  • Le deuxième crochet carré contient l'indice du champ recherché.

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 :

Python

indice = int(numero) - 1

id = resultat[indice][0]

ou, si vous préférez :

Python

id = resultat[int(numero) - 1][0]

Il sera alors possible de supprimer l'enregistrement avec une requête du genre :

Python

requete = 'DELETE FROM etablissements WHERE id = ?'

curseur.execute(requete, (id,))

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre