- Formations
- conversion_path Parcours & Formations
- science Projets
- data_object Exercices de code
- psychology Exercices IA
- quiz Quiz
- Articles
- rss_feed Blog
- sort_by_alpha Glossaire
- menu_book Guides
- help_center FAQ
- media_link Ressources
- Communauté
- groups La communauté
- forum Questions
- live_tv Mentorats
- science Projets mensuels
- Formations
- conversion_path Parcours & Formations
- science Projets
- data_object Exercices de code
- psychology Exercices IA
- quiz Quiz
- Articles
- rss_feed Blog
- sort_by_alpha Glossaire
- menu_book Guides
- help_center FAQ
- media_link Ressources
- Communauté
- groups La communauté
- forum Questions
- live_tv Mentorats
- science Projets mensuels
Deviens membre Premium magic_button
Débloque cette session en devenant Membre Premium 🚀
Inscris-toi
(c'est gratuit !)
Un compte est nécessaire pour participer aux discussions.
Créer un compte person00:00:00 :Dans cette partie, on va rajouter la sauvegarde de nos utilisateurs dans une base de données JSONavec TinyDB. Donc on va déjà importer TinyDB à partir du module, donc from TinyDB, on va importer
00:00:13 :la classe TinyDB qui va nous permettre de créer une connexion à notre base de données JSON. Cetteinstance de TinyDB, je vais la créer à l'intérieur de ma classe, donc en tant qu'attribut de classeet non pas d'instance. Alors pourquoi un attribut de classe et pas un attribut d'instance ? Parce
00:00:31 :que si jamais on crée plusieurs utilisateurs et que par la suite, pour une raison ou une autre,on souhaiterait modifier par exemple le chemin de notre base de données pour la mettre ailleurs,eh bien on ne souhaite pas le faire au niveau de l'instance. On ne souhaite pas que chaque instance
00:00:45 :de l'utilisateur ait sa propre base de données. Donc ce qu'on souhaiterait faire, c'est par exemple,une fois qu'on a créé plusieurs utilisateurs ici, si on souhaite modifier la base de données,on souhaite faire cette modification au niveau de la classe utilisateur sur par exemple notrevariable qu'on va appeler db, donc notre attribut de classe db, ce qui aurait pour effet de modifier
00:01:05 :toutes les instances d'utilisateurs que l'on aurait créé, donc toutes ces instances ici. Alors que sion fait un attribut dans le unit ici et qu'on attache cet attribut à chaque instance en faisantpar exemple self.db ici, donc self.db comme ceci, eh bien là on aurait une instance de base de
00:01:21 :données pour chaque utilisateur. Donc moi je vais faire un attribut ici directement dans ma classe,donc je vais l'appeler db, et ça va être une instance de tiny db comme ceci, et on va ensuitemettre un chemin absolu vers un fichier json qui sera à l'intérieur du dossier crm. Pour ça on va
00:01:38 :utiliser patlib, donc on va dire from patlib import pat, et on va utiliser cette classe pat et lavariable spéciale file ici, qui va nous permettre de récupérer le chemin complet vers le scriptcourant, donc le fichier crm.py. On va ensuite utiliser resolve pour résoudre les chemins
00:01:59 :symboliques ou les raccourcis potentiels qu'on pourrait avoir sur notre fichier crm.py, et onva ensuite récupérer le dossier parent en faisant .parent. On va concatener tout ça avec un
00:02:09 :slash avec db.json, et on va spécifier qu'on veut un indent de 4 pour pouvoir avoir en faitquelque chose d'un peu plus facilement lisible à l'intérieur du fichier json. Donc tout ça ici ça
00:02:22 :nous permet de récupérer le chemin absolu vers db.json, donc vers un fichier qu'on va mettreà l'intérieur donc de notre dossier crm. C'est ce fichier json qui va contenir les informations de
00:02:33 :notre base de données, et avec le indent ici on spécifie juste qu'on veut une indentation de 4dans le fichier json. Donc on récupère tout ça dans un attribut db qui appartient à ma
00:02:41 :classe utilisateur, et on va pouvoir ensuite utiliser cette base de données pour sauvegarderles utilisateurs que l'on crée dans notre base de données. Donc pour ça on va créer une méthode
00:02:51 :qu'on va appeler save, donc je vais la mettre un peu plus bas ici, je vais l'appeler save,on met en premier paramètre ici le self, et je vais spécifier un deuxième paramètre qui vas'appeler validate data, qui par défaut va être à false, mais si on le met à true qu'est ce que
00:03:06 :ça va faire ? En fait ça va faire qu'on va vérifier les données avec notre méthode qu'on a crééeici, la méthode checks. Donc si on dit qu'on veut valider les données, on va dire if validate data,
00:03:15 :donc si validate data est à true, on va faire les checks, donc checks comme ceci, voilà. Donc on vaappeler la méthode checks qui va appeler ces deux méthodes ici. Donc ça ça va permettre à quelqu'un
00:03:26 :qui utiliserait notre script, lorsqu'il fait un user.save ici, de choisir si oui ou non il souhaiteles données avant de les sauvegarder dans la base de données. Donc par défaut on le met à false,
00:03:37 :ça veut dire qu'il pourrait créer un utilisateur ici par exemple avec des symboles qui ne sont pasvalides, il ferait un save donc sur cette instance et ça ne poserait pas de problème, parce que pardéfaut on est avec le validate qui est égal à false, donc on ne va pas faire les checks ici. Si
00:03:51 :par contre il souhaite valider les données, eh bien il peut passer le validate data ici à true,et là ça va faire les checks, et dans ce cas ci ça ne passerait pas. Donc ça c'est juste un
00:03:59 :comportement que l'on rajoute en plus dans notre méthode save qui permet de valider les donnéesavec nos méthodes qu'on a créées dans la partie précédente. Et une fois qu'on a passé ça, on va
00:04:08 :insérer les éléments à l'intérieur de notre base de données. Donc on va utiliser user.db, donc notrebase de données, et on va utiliser la fonction insert pour insérer des données dans la base dedonnées. Alors là ce qu'on pourrait faire c'est passer un dictionnaire et donner ici par exemple
00:04:24 :firstname, et mettre l'attribut firstname de notre instance. Et on pourrait faire pareil pourlastname, pour l'adresse, et pour le numéro de téléphone. Vous conviendrez que c'est un petit
00:04:33 :peu long à faire. Ce qu'on peut faire c'est utiliser une petite technique, utiliser cetattribut spécial qui est l'attribut dict qui va en fait automatiquement nous donner un dictionnaireavec tous les attributs de notre instance. Donc je vais vous montrer ce que ça donne, je vais
00:04:48 :enlever mon save, je vais enlever également cette partie ici donc le user.db, et là à la place jevais faire un print de user.--dict comme ceci. Donc comme je viens de vous dire cette variable
00:05:00 :spéciale en fait c'est tout simplement un dictionnaire qui va nous afficher tous les attributsqu'on a sur notre instance. Donc là par exemple si je rajoutais un attribut a qui est égal à 5,
00:05:08 :vous allez voir si j'exécute mon script qu'on va avoir cet attribut en plus sur chacune de nosinstances. Donc là je lance le script, et vous voyez qu'on a bien notre dictionnaire avec à
00:05:17 :chaque fois le nom de l'attribut en chaîne de caractère et sa valeur associée. Donc on a lefirstname, le lastname, le phone number, l'adresse, et on va également retrouver le a que l'on avaitajouté ici. Donc je peux l'enlever, mais vous voyez que c'est très pratique cette variable
00:05:31 :dict puisque ça va nous permettre ici plutôt que de faire ce dictionnaire à la main, donc de fairele firstname, le lastname, etc. Et bien on peut directement passer le self.dict et ça va
00:05:42 :l'insérer à l'intérieur de notre base de données. Alors bien sûr ça marche dans notre cas précispuisqu'on a de la chance, on a uniquement ces quatre attributs et c'est ces quatre attributsque l'on souhaite mettre à l'intérieur de notre base de données. Si jamais on avait d'autres
00:05:53 :attributs que l'on ne souhaitait pas inclure dans la base de données, forcément ça ne fonctionneraitpas. Enfin on pourrait mettre le self.dict ici, mais ça mettrait tous les attributs de notre
00:06:01 :instance. Donc ce n'est pas forcément ce que vous voulez, mais dans ce cas-ci ça fonctionne. Doncj'insère avec user.db dans ma base de données les attributs de mon instance. Donc on va tester
00:06:11 :tout ça. Vous voyez que le fichier a bien été créé ici, mais pour l'instant il ne contient rien.On va tester notre méthode save. On va faire un save ici. On va enlever le Patrick ici et à la
00:06:20 :place on va mettre fake.firstname pour avoir des données aléatoires. Et on va faire pareil pourle phoneNumber, on va mettre fake.phoneNumber comme ceci. Donc je teste tout ça, je sauvegarde,
00:06:31 :je lance mon script. Là on a non puisque forcément on n'a rien retourné pour l'instant dans le saveet là j'ai fait un print de user.save donc ça nous affiche non, c'est normal. Si je vais voir
00:06:41 :à l'intérieur de db.json on voit que j'ai bien toutes les données qui sont sauvegardées avec àchaque fois le firstname, le lastname, le phoneNumber et l'adresse. Donc ça fonctionne parfaitement et
00:06:51 :ce que je vais vouloir faire ici c'est quand même retourner quelque chose puisque là pour l'instantvous avez vu que quand on fait un print de user.save ça ne retourne non. Donc ce qu'on va
00:06:58 :faire à la place c'est retourner tout simplement cet insert ici et ça devrait nous retourner sije me souviens bien un nombre entier. Donc je relance et effectivement ça nous retourne le
00:07:07 :nombre donc l'identifiant qu'on a qui est dans notre base de données. Donc là par exemple vousvoyez qu'on a 20, 19, 18, etc. Donc c'est l'identifiant unique de chaque élément dans
00:07:16 :notre base de données et donc c'est ce que nous retourne ici cette méthode insert. Donc on peutajouter une annotation de type ici dans notre fonction, on pourrait également l'ajouter pournotre validateData, dire que c'est un booléen et qu'il est égal à false et on va indiquer unevaleur retour comme ceci en disant que ça va nous retourner un nombre entier donc on rajoute int
00:07:34 :ici tout simplement. Maintenant ce que j'aimerais bien faire c'est faire une fonction qui mepermette de récupérer tous ces éléments dans ma base de données. Donc là je vais faire une
00:07:42 :fonction, je ne vais pas la mettre directement dans ma classe puisque là cette classe ellereprésente un utilisateur unique. Moi ce que je veux c'est récupérer potentiellement tout ce
00:07:51 :qu'il y a dans ma base de données. Donc pour ça je ne vais pas mettre une méthode à l'intérieur dema classe user, je vais faire une fonction en dehors et cette fonction je vais l'appeler toutsimplement getAllUsers. Et cette fonction qu'est ce qu'elle va me retourner ? Elle va me retourner
00:08:03 :une liste d'utilisateurs, donc une liste d'instances ici de ma classe user. Alors pourrécupérer tous les éléments de ma base de données on peut faire user.db.all. Si je fais un print de
00:08:15 :ça, donc plutôt que de faire toutes ces lignes ici, je vais les commenter donc pour ça vous faitescommande slash et ça va automatiquement commenter toutes les lignes de code. Et ensuite ce que je
00:08:24 :vais faire ici c'est appeler donc ma fonction getAllUsers, je sauvegarde et là vous voyezqu'on a un espace en trop donc je vais juste le supprimer et m'assurer que toutes mes tabulationssont bien faites voilà. Donc je sauvegarde et je lance le script et là vous voyez qu'on a bien
00:08:36 :tous les éléments de notre base de données mais pour l'instant c'est des dictionnaires. On a uneliste qui contient des dictionnaires. Nous ce qu'on aimerait c'est avoir des instances de nos
00:08:44 :utilisateurs puisque là en fait si j'essaie de récupérer un élément, par exemple le premierélément, je vais avoir un dictionnaire et ensuite il va falloir que j'utilise la méthode get ou lescrochets pour récupérer le firstname, le lastname, etc. Moi ce que j'aimerais bien c'est avoir des
00:08:57 :instances de ma classe utilisateur pour faire par exemple user.firstname comme ceci. Donc ce queje vais pouvoir faire c'est boucler à travers chaque élément de ma base de données qui vaêtre donc un dictionnaire et créer une instance à partir de tout ça. Donc on va dire pour user.in
00:09:12 :user.db.all et là si je fais un print de user on va retrouver donc ce qu'on avait tout à l'heure,on va retrouver donc ce qu'on avait ici sauf que cette fois-ci j'ai tous les dictionnaires séparés.
00:09:22 :Donc là c'est pratique j'ai un dictionnaire et je vais pouvoir à partir de ce dictionnaire recréerune instance. Donc là encore vous allez voir il y a différentes façons de faire. La façon de faire
00:09:31 :que les débutants font généralement ce serait de faire un user et entre crochets mettre firstnamecomme ceci et le passer donc aux paramètres firstname et faire pareil pour tous les autresparamètres lastname comme ceci égal à user.lastname et faire pareil pour le phone number et le
00:09:50 :address. Ça marche mais c'est un petit peu long. A la place ce qu'on peut faire c'est utiliser leunpacking. Donc on va faire avec deux astérisques comme ceci et on va unpacker le user. Donc qu'est
00:10:01 :ce que ça veut dire unpacker ? En fait ça veut dire déballer c'est à dire qu'on va prendre leséléments de notre dictionnaire. Donc on va dire par exemple que la chaîne de caractère ici elle
00:10:09 :est égale à notre firstname. Donc ça c'est une façon de faire assez pratique puisqu'on va pouvoirutiliser la clé de notre dictionnaire comme nom de paramètre et la valeur comme valeur qu'on vapasser à notre paramètre. Donc quand on déballe ici le user, quand on déballe notre dictionnaire,
00:10:24 :on va passer à chaque fois les valeurs à tous les paramètres que l'on a dans notre méthode initpuisque c'est cette méthode qui est appelée quand on va créer une classe utilisateur ici. Donc là je
00:10:34 :vais créer une variable, je vais appeler par exemple eachuser pour la différencier de cettevariable ici et que je fais un print par exemple de eachuser. Là on va pouvoir faire un print par
00:10:43 :exemple de eachuser.phoneNumber puisque là on a une instance et donc cette fois-ci on va avoiraccès à l'attribut phoneNumber sur notre instance. Donc je sauvegarde, je relance mon script et là
00:10:52 :vous voyez qu'on a bien récupéré correctement tous les numéros de téléphone de notre base dedonnées. Je pourrais faire un print de full name pour afficher le nom complet de tous les
00:11:00 :utilisateurs de notre base de données. Donc ça fonctionne, on a bien récupéré les utilisateurssauf que pour l'instant on fait juste un print. Nous ce qu'on veut faire c'est retourner une liste
00:11:08 :avec tous ses utilisateurs. Alors je pourrais faire une liste vide et la remplir petit à petit, ceque je vais faire à la place c'est une compréhension de liste. Donc on va faire un return d'une
00:11:16 :compréhension de liste, donc on met les crochets et ici on va juste récupérer ce qu'on avait,donc notre utilisateur pour user in user.db.all. Donc là je suis juste en train de réorganiser ma
00:11:28 :boucle sous forme de compréhension de liste. Qu'est-ce qu'on fait ? On crée une instance denotre utilisateur avec l'unpacking de user pour chaque user in user.db.all. Donc accrochez-vous,
00:11:39 :là ça fait beaucoup de choses à la suite. User ici ça va être chaque élément, donc ça va êtrepar exemple notre dictionnaire ici, ensuite notre dictionnaire ici, ce dictionnaire on va l'unpackeravec les doubles astérisques, on va le passer à notre classe user ici, donc on va créer une
00:11:53 :instance d'utilisateur et on va faire ça pour chaque élément dans notre base de données. Etdonc on retourne ça sous forme d'une compréhension de liste et donc si je supprime tout ça et que jefais un print de getAllUser, vous allez voir qu'on va retrouver toutes les instances de notre base
00:12:08 :de données. Donc je lance le script et là on retrouve bien une liste avec à chaque fois toutesnos instances. Donc c'est parfait, on a réussi à récupérer les données de notre base de données,
00:12:17 :donc on a les deux blocs, on a le bloc qui nous permet de sauvegarder les données dans notre basede données et le bloc qui nous permet de récupérer tous les utilisateurs de notre base de données.
00:12:26 :La dernière chose que j'aimerais faire c'est à partir d'une instance spécifique que je créepouvoir récupérer son équivalent dans la base de données. Donc par exemple imaginons que j'ai le
00:12:36 :prénom et le nom de famille de ce contact, donc Martin voisin ici, et je souhaite récupérer cesinformations, donc l'information du numéro de téléphone et de l'adresse. Donc là ce que je
00:12:46 :vais faire c'est créer un utilisateur, donc je vais l'appeler Martin, on va créer une instance àpartir de user, on va dire qu'il s'appelle Martin voisin, et donc ce que j'aimerais c'est pouvoirrécupérer l'instance dans la base de données à partir de mon instance ici de ma classe. Donc
00:12:59 :pouvoir faire par exemple print Martin et on va faire une méthode ou un attribut par exempledbInstance qui va nous retourner, s'il la trouve dans la base de données, l'instance de notreutilisateur, donc avec le phoneNumber et le address. Donc on va rajouter une propriété à
00:13:14 :l'intérieur de notre classe, donc après la propriété fullName par exemple ici, on varajouter une propriété qu'on va appeler dbInstance et on va utiliser les options de filtre deTinyDB pour aller récupérer l'utilisateur qui a ce prénom et ce nom de famille. Donc à
00:13:30 :l'intérieur de notre propriété ici, on va utiliser user.db donc notre base de données et on vautiliser la fonction get pour récupérer un élément à l'intérieur de notre base de données. Pour ça
00:13:40 :on va utiliser la fonction where qui est disponible donc à l'intérieur de TinyDB. Doncon utilise where ici et on va dire qu'on souhaite récupérer l'utilisateur avec le nom donc wherefirstName est égal à self.firstName et on va utiliser l'esperluette comme ceci pour concaténer
00:13:58 :différentes conditions. Donc on veut avoir les deux conditions qui sont vérifiées, donc cettepremière condition ici, à savoir le prénom qui est égal à firstName et la deuxième condition çava être where lastName égal égal à self.lastName et on va retourner tout ça avec return. Donc là
00:14:15 :on fait deux filtres, on fait where firstName égal à self.firstName et where lastName égal àlastName et donc si on a quelque chose dans notre base de données qui a le prénom qui est égal ànotre prénom de l'instance et le nom de famille qui est égal au nom de famille de l'instance et
00:14:29 :bien on va récupérer l'élément de notre base de données au complet. Donc on va vérifier si çafonctionne, on va faire un print donc de martin.dbinstance, je sauvegarde et je relance le
00:14:39 :script et là vous voyez qu'on a bien récupéré tout le dictionnaire qui est dans notre base dedonnées, donc ce dictionnaire ici. On va essayer cette fois-ci avec patrick voisin à la place et
00:14:49 :là normalement à moins qu'on ait un patrick voisin quelque part ici dans la base de données ça nedevrait rien nous retourner. Donc je relance et là vous voyez qu'on a bien none puisque cet
00:14:58 :utilisateur n'existe pas. Donc voilà pour cette propriété ici, ça nous permet à partir uniquementd'un prénom et d'un nom de famille de récupérer l'adresse et le numéro de téléphone si cetutilisateur est présent dans la base de données. Et avant de terminer cette vidéo on va rajouter
00:15:12 :deux méthodes, une méthode qui va me permettre de vérifier si l'utilisateur existe dans la basede données. Donc ce que j'aimerais bien c'est pouvoir faire tout simplement une méthode comme
00:15:21 :ceci existe et que ça me retourne true ou false pour savoir si l'utilisateur existe ou non dansma base de données et on va faire une autre méthode qui est delete tout simplement qui vanous permettre de supprimer l'élément de la base de données. Donc je vais les créer ici je vais
00:15:35 :les rajouter le delete on va le mettre juste avant le save donc on va faire def delete comme cecion met le self pour l'instant je mets juste un pass je vais juste créer les deux fonctions eton va faire le exist juste au dessus donc def exist comme ceci avec le self là encore. Donc
00:15:50 :pour le exist on va tout simplement retourner notre DB instance sous forme de boule 1. Je vaisfaire un return de boule de self.DBInstance. Donc moi ce que je veux dans le exist ici c'est
00:16:00 :avoir true ou false. Je ne veux pas avoir un dictionnaire ou none. Ce que je veux c'estvraiment juste un boulet 1. Donc ce que je fais c'est que je vais convertir mon DB instance en
00:16:11 :boulet 1 comme ça si on a un dictionnaire avec des informations par exemple le first name avecle prénom etc etc si on fait un boulet 1 d'un dictionnaire qui contient des informations etbien ça nous retourne true. Si on fait un boulet 1 d'un dictionnaire vide par contre ça nous retourne
00:16:25 :false mais si on a un dictionnaire ça veut dire qu'on a un dictionnaire de notre base de donnéesavec des informations à l'intérieur donc ça veut nous retourner quelque chose de vrai. Par contre si
00:16:33 :l'utilisateur n'existe pas dans la base de données martin.DBInstance ici ça va nous retourner noneet un boulet 1 de none ça donne quoi ça donne false. Donc en convertissant en boulet 1 ce que
00:16:45 :nous retourne DBInstance ça nous permet de vérifier si l'utilisateur existe ou non dansla base de données. Donc on va vérifier que ça fonctionne je vais faire un print de martin.exist
00:16:55 :je sauvegarde je relance le script et là vous voyez qu'on a bien donc récupéré l'instancedonc le dictionnaire on retourne ensuite un boulet 1 de ce dictionnaire donc dans ce cas-ci ça vanous retourner true et c'est vrai puisque donc martin existe bien dans la base de données. Si
00:17:10 :par contre je mets patrick je sauvegarde et je relance cette fois-ci on a bien none pour leDBInstance et quand on retourne un boulet 1 de none ça nous retourne bien false. Donc voilà là
00:17:19 :encore une petite astuce pour partir de quelque chose d'existant on fait juste récupérer notreDBInstance ici le retourner sous forme de boulet 1 et ça nous permet d'avoir l'information de sinotre utilisateur existe ou non dans la base de données. Pour finir on va faire le delete donc
00:17:35 :on va déjà vérifier si l'utilisateur existe dans la base de données puisque pour pouvoir supprimerl'utilisateur de la base de données il faut bien qu'il existe donc on va faire là encore unevérification avec ifself.exist on pourrait également faire ifself.DBInstance ça reviendrait
00:17:49 :à peu près au même mais comme on a fait une fonction existe c'est un peu plus logiqued'utiliser celle-ci donc s'il existe dans la base de données on va le supprimer donc on va faireuser.DB.Remove et pour supprimer un élément on peut utiliser son identifiant donc l'identifiant
00:18:05 :c'est ce qu'on a ici. Quand on récupère une instance avec get donc ce qu'on a fait ici çava nous retourner en fait un objet un petit peu spécial je vous avais dit que ça retournait undictionnaire si on fait un print de DBInstance on a l'impression en fait que c'est un dictionnaire
00:18:17 :donc là j'ai mis patrick voisin donc forcément ça ne retourne none mais si je remets martinvoisin on va récupérer notre dictionnaire donc ça ressemble à un dictionnaire mais en fait ce n'estpas exactement un dictionnaire. Pour vous le montrer je vais utiliser la fonction type je
00:18:30 :sauvegarde et je relance et là vous voyez qu'on a en fait un objet du type tinyDB.table.documentce qui est intéressant c'est que sur cet objet qui ressemble donc en tout point à un dictionnaireon a quand même quelques attributs en plus on a notamment l'attribut docId qui va nous permettre
00:18:45 :de récupérer cet identifiant et avec cet identifiant on va pouvoir supprimer des élémentsde notre base de données donc là si je sauvegarde et que je relance on voit qu'on a bien le numéro2 qui correspond à martin voisin ici dans notre base de données et cet identifiant je vais pouvoir
00:18:59 :l'utiliser dans le remove ici pour supprimer les éléments de ma base de données donc je vaisfaire doc-ids alors c'est doc au singulier doc-ids comme ceci et on va lui passer une listeet dans cette liste on va donc passer DBInstance.docId donc là ce qu'on dit c'est qu'on veut
00:19:16 :supprimer tous les éléments de notre base de données dont l'identifiant est égal à ce qu'onpasse ici donc la liste avec les identifiants donc dans ce cas ci on passe l'identifiant de notreinstance. Donc si notre élément existe dans la base de données on le supprime et on va juste
00:19:30 :faire un return de tout ça et alors là je ne suis plus sûr de ce que ça retourne si ça retourneun booléen ou une liste ou quelque chose du genre donc on va le tester on va faire martin.delete
00:19:40 :et on va faire un print de tout ça pour vérifier ce que ça nous retourne donc je sauvegarde là j'aibien martin voisin donc ça devrait le supprimer je lance mon script et là vous voyez qu'on a bienen fait une liste avec l'élément qui a été supprimé donc là je vais voir dans ma base de
00:19:53 :données et vous voyez que le 2 n'existe plus on passe directement de 1 à 3 et martin voisinn'existe plus dans ma base de données donc ça fonctionne et donc ce remove ici ça nous retourneune liste qui contient des nombres entiers qui correspondent au document id des éléments qu'on
00:20:06 :a supprimé donc je vais mettre une annotation de type ici pour que ce soit bien clair ce qui estretourné donc en fait ça nous retourne une liste de nombres entiers donc je mets liste avecentre crochet int ici pour le spécifier alors là vous voyez que j'ai le mot liste qui est surligné
00:20:20 :en rouge alors ça c'est parce que j'utilise la version 3.7 de python dans les dernières versionsde python vous pouvez l'utiliser directement mais je crois que dans les versions 3.8 et inférieures
00:20:29 :il faut l'importer depuis le module typing donc il faut faire from typing import list comme ceciavec une majuscule et c'est cette liste que vous allez pouvoir utiliser dans les annotations detype et là vous voyez que l'erreur disparaît donc ça c'est vraiment pour les anciennes versions depython dans les toutes dernières versions donc à partir de la version 3.8 ou 3.9 vous pouvez
00:20:48 :utiliser directement liste comme ceci pour les annotations de type si vous utilisez une versionantérieure donc comme moi ici la version 3.7 il faut l'importer à partir du module typing et là
00:20:57 :vous voyez que donc l'erreur n'est plus là donc ce que je vais faire également ici c'est retournerdans le cas où l'utilisateur n'existe pas retourner une liste vide tout simplement alors pourquoi jefais ça pour garder une cohérence en fait dans ce qui est retourné je vais vous montrer un exemple
00:21:12 :si là je refais en fait une instance de martin voisin maintenant martin voisin il n'existe plusdans la base de données donc si je fais un print de martin.delete et bien on ne va pas passer dans
00:21:21 :cette structure conditionnelle on ne va donc pas retourner ici ma liste avec les nombres entierset donc si on ne passe pas dans cette condition on va retourner par défaut non donc là je vaisvous montrer si je fais un print de martin.delete et que je lance le script on a non ici alors c'est
00:21:35 :un petit peu embêtant généralement dans les fonctions quand on a des résultats qui peuventêtre différents puisque imaginez que quelqu'un utilise mon script et qu'il s'attende à avoirdonc une liste de nombres entiers il pourrait se dire que par exemple il va boucler par la suitesur cette liste donc il pourra dire par exemple pour i in tout ça et ensuite faire un print du
00:21:52 :i donc du document id qui nous est retourné donc là ce serait logique de pouvoir faire ça puisqu'ona mis une annotation de type qui indique que cette fonction va retourner une liste de nombres entiersmais ce n'est pas tout le temps le cas puisque comme je viens de vous le dire en fait si on ne
00:22:04 :passe pas dans cette structure conditionnelle on va retourner non et si on retourne non on ne peutboucler sur none donc ce qu'il faut faire c'est avoir quelque chose de cohérent c'est à direque peu importe ce que nous retourne la fonction ça va toujours retourner le même type de données
00:22:17 :donc là en fait si on ne passe pas dans cette structure conditionnelle je vais retourner toutsimplement une liste vide comme ça on aura à chaque fois une liste qui va contenir soit desnombres entiers soit rien dans ce cas ci mais au moins on pourrait potentiellement boucler dessus
00:22:30 :donc là si je garde ma boucle pour i in martin delete je sauvegarde et je lance le script làvous voyez qu'on n'a pas d'erreur si j'enlève le return comme ceci et que je relance le script làvous voyez qu'on a une erreur qui nous dit que none type object is not iterable donc ça c'est
00:22:44 :la fameuse erreur qui dit en fait qu'on ne peut pas itérer sur l'objet none donc vous voyez quelà c'est très important de rajouter ce return ici pour s'assurer qu'on a toujours le même typede données qui est retourné et pour ne pas avoir donc potentiellement des erreurs par la suite
00:22:57 :donc petite chose subtile mais très importante pour avoir des scripts qui fonctionnent de labonne façon donc voilà pour cette vidéo qui était assez longue mais qui vous a permis de voirdonc comment on pouvait inclure la sauvegarde d'une base de données avec toutes les opérations debase donc pour sauvegarder les éléments dans la base de données pour les supprimer pour vérifier
00:23:15 :s'ils existaient donc il y avait pas mal d'informations ici on pourrait encore bien sûr améliorer cescript là par exemple dans le save je n'ai pas vérifié si l'élément existait déjà ou pasdonc je pourrais dire par exemple ici if self.existe et bien dans ce cas ci on retournerait
00:23:28 :moins un et sinon on insérait l'élément dans la base de données donc vous voyez on peut vraimentcontinuer encore à faire des vérifications comme ça et là vous voyez que j'utilise exactement lamême logique que ce que je viens de vous expliquer avec la liste c'est à dire que là je pourrais
00:23:41 :retourner par exemple une liste vide ou je pourrais retourner none mais ce que je fais c'est que jepréfère retourner moins un pourquoi parce que là j'ai indiqué avec la notation de type qu'on varetourner un nombre entier donc s'il existe déjà et bien je ne l'insère pas et je retourne tout
00:23:54 :simplement moins un et si ça existe et bien je l'insère et je retourne le numéro donc le numéroici de l'élément que j'ai inséré dans ma base de données donc là encore on garde de la cohérencesi on indique ici qu'on retourne un nombre entier les utilisateurs qui vont utiliser notre API vont
Ce n'est pas fini...
✋
Tu as complété % du parcours 🔥
Termine l'intégralité de la formation pour pouvoir débloquer ton attestation de réussite.