truc2geek

2013/04/21

Carnet d’adresse, part 9

Filed under: Carnet d'adresses (Python), Programmation, Projets, Python, SQLite — truc2geek @ 21:31

Dans l’article précédent, on a codé la possibilité de créer des données « groupe » et « personne ».

Aujourd’hui, on va coder la possibilité de supprimer des données.
On reprend le code version v0_009_02, on supprimes les tags #NEW #MAJ et #SUPP, on supprime les print et raw_input qui ont servi à débugger.
La version v0_010_00 est disponible ici.

conception

suppression

C’est depuis le menu de gestion de chaque type de donnée que l’utilisateur pourra supprimer les données, en entrant « 3 x », exemple :
01.gif

Voici le déroulement :
l’utilisateur entre « 3 x », par exemple « 3 5 » pour supprimer le groupe « voisins »
on lui demande de confirmer qu’il veut supprimer cette donnée
s’il répond oui :
on tente de supprimer la donnée
on affiche le résultat (suppression réussie ou échouée)
s’il répond non :
on affiche que la suppression a été annulée
on réaffiche le menu de gestion

données liées

Un traitement supplémentaire sera nécessaire pour les données auxquelles on rattache d’autres données.
Par exemple, les personnes sont rattachées aux adresses ; ainsi, la personne « Joe lecowboy » est rattaché à l’adresse « 16 boulevard du Père Noël, 64640 HELETTE ».
On ne peut pas supprimer cette adresse tant que Joe Lecowboy y est rattaché : en tout cas on ne devrait pas pouvoir.
Si on a bien travaillé quand on a créé la BD, cette impossibilité est garantie par l’intégrité référentielle.
Ainsi, si l’utilisateur demande à supprimer cette adresse, il faudra lui répondre que cette suppression est impossible.

Il reste à définir le niveau exact d’information : on peut informer simplement l’utilisateur que la suppression est impossible, au choix :
– sans lui expliquer pourquoi
– et lui expliquer qu’une donnée ou plus, lui est rattachée
– et lui préciser quelle(s) donnée(s) lui est(sont) rattachée(s)
– en option, on peut lui proposer de supprimer automatiquement toutes les données qui y sont liées, pour permettre la suppression demandée

attention : pour implémenter cette dernière option, il faudra prendre en compte les multiples niveaux de dépendance, selon le schéma de la Base de Données.
Dans la version actuelle de l’application, en ce qui concerne les données que l’on peut déjà manipuler via l’interface, on a un seul « niveau » de lien : une personne est rattachée à une adresse.
Au niveau du schéma de la BD par contre, on a bien plusieurs niveux d’imbrication : une personne est rattachée à une adresse, et un numéro de téléphone est rattaché à une personne, ce lien apparaît clairement quand on regarde les instructions SQL de création des tables :
02.gif

03.gif

Le contenu des tables est aussi très clair :
04.gif

05.gif

Il faudra prendre ça en compte, si on veut proposer cette fonctionnalité.

test intégrité référentielle

Avant de continuer plus loin, on fait une parenthèse simplement pour vérifier que la suppression d’une donnée liée est impossible.
On code une fonction qu’on appellera à partir du menu principal, et on supprimera ces modifications après le test.

La fonction TestSuppDonneeLiee tente de supprimer l’adresse 9, soit 16 boulevard du Père Noël 64640 HELETTE.

code de la fonction :
06.gif

modif fonction Principal, pour ajouter la possibilité d’exécuter la fonction TestSuppDonneeLiee depuis le menu principal :
07.gif

on teste :
08.gif

on entre « 7 » pour lancer le test, qui s’exécute et le menu principal se réaffiche aussitôt.
on entre « 3 » pour voir les adresses existantes :
09.gif

mauvaise surprise!! la suppression de l’adresse id 9 a fonctionné… l’intégrité référentielle n’est pas activée??

pourtant, dans les tests effectués dans l’article « SQLite part 2« , l’intégrité référentielle était respectée.

Juste pour tester, on va tester la même chose à partir de la console, par exemple en essayant de supprimer l’adresse 4, 85 rue des Chtis 59000 ROUBAIX.
La personne 6, Bob Batimeau, est rattachée à cette adresse.

lancer la console
on ouvre la BD et on définit quelques paramètres d’affichage :
10.gif

on active l’intégrité référentielle :
14.gif

lister les adresses :
16.gif

lister les personnes :
12.gif

afficher une vue :
13.gif

on tente de supprimer l’adresse 4 :
15.gif

le résultat est bien celui attendu : la suppression de cette adresse est interdite.

Pour vérifier : supprimer la personne 6, et tenter à nouveau de supprimer cette adresse : comme plus aucune personne ne sera
rattachée à cette adresse, la suppression devrait être autorisée :
on commence par supprimer toutes les données liées à la personne 6, on les repère via SQLite Expert pour aller plus vite :
17.gif18.gif
19.gif

on a donc des données à supprimer dans les tables T_d_Email, T_d_Numero et T_p_Groupe :
20.gif

les données ont bien été supprimées :
21.gif

22.gif

23.gif

supprimer la personne 6 et l’adresse 4:
25.gif

ok, maintenant qu’on a supprimé les données liées à l’adresse 4, on peut supprimer l’adresse elle-même.

donc, pourquoi l’intégrité référentielle est respectée quand on manipule la BD via la console, et pas quand on la manipule via l’application Python?

après vérification :
la version de SQLite3 que j’utilise via la console est la 3.7.11
Python 2.6.5 utilise la version 2.5.9 de SQLite3

Or, l’historique sur le site de SQLite indique que l’intégrité est prise en charge à partir de la version 3.6.19.

la solution est simple :

  • installer une version de Python plus récente, qui utilise la version 3.6.19 (ou plus récente) de SQLite
  • vérifier que l’appli fonctionne bien avec cette nouvelle version
  • et enfin, passer à la suite : coder les fonctions utiles à la suppression des données

Ce sera l’objet du prochain article…

Publicités

Laisser un commentaire »

Aucun commentaire pour l’instant.

RSS feed for comments on this post. TrackBack URI

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Créez un site Web ou un blog gratuitement sur WordPress.com.

%d blogueurs aiment cette page :