Ressources Magic Makers

 

Site en maintenance

 
Nous sommes actuellement entrain de mettre à jour les ressources de ce site.
Pendant la mise à jour vous pouvez retrouver tous les nouveaux contenus sur le site
 

https://lp-magicmakers.fr/

 
 

C’est quoi une requête ?

Pour utiliser ta base de données, tu devras faire des requêtes. Les opérations les plus courantes sont :

  • Créer une nouvelle entrée sur la base données (on dit aussi insérer)
  • Récupérer et lire les informations sur la base de données
  • Mettre à jour (=changer les valeurs) des informations sur la base de données
  • Supprimer des informations sur la base de données.
Faire une requête sur sa base de données, c’est donc exécuter l’une de ces opérations ! On peut traduire requête par « demande », faire une requête c’est faire une demande à la base de données.

En anglais, on regroupe souvent ces 4 opérations sous le terme CRUD (Create Read Update Delete, ce qui signifie « Créer Lire Mettre à jour Supprimer »).

Insérer une nouvelle donnée

Pour insérer une nouvelle donnée, il suffit d’utiliser la fonction insert_one sur notre base de donnée et de lui passer en paramètre le dictionnaire que l’on veut insérer.

Il est important de bien comprendre comment fonctionne la ligne ci-dessus.

  • db_toto est une variable qui correspond à la collection sur laquelle tu souhaites faire une opération. Cela signifie que quelque part dans le code, on a déjà récupéré l'accès à cette collection et on l'a stocké dans cette variable !
  • insert_one() est la fonction que l'on va utiliser - en l'occurence, cette fonction permet d'insérer une nouvelle donnée.
  • Entre les {}, c'est notre filtre de requête. Cela permet de filtrer les documents pour récupérer uniquement ceux qui nous intéressent. Autrement dit, cela permet de préciser notre requête ! Qu'est-ce que je souhaite insérer ? Ou dans le cas de la fonction find(), quels documents est-ce que souhaite récupérer ? etc.

Tu verras que les autres fonctions (find(), update_one(), delete()... ) fonctionnent toutes avec le même principe !

Quelque part dans mon code, je pense à stocker l’accès à ma collection dans une variable…
(ici appelée db_utilisateurs dans cet exemple)

… puis je peux alors écrire mes requêtes ! Ci-dessous, un exemple où un nouvel utilisateur est ajouté dans la base de données.

  db_utilisateurs.insert_one({
"nom" : "Lucas",        # Nom de l'utilisateur
"mdp" : "UnSuperMotDePasse",# Mdp de l'utilisateur
"age" : 32              # Age de l'utilisateur
  })

À gauche, le code pour insérer un nouvel utilisateur. À droite, on peut voir que l’entrée a bien été ajoutée sur la base de données.
Note : Il s’agit ici juste d’un exemple. Insérer un mot de passe sans le chiffrer dans une base de données est une très mauvaise pratique 😉

Tu noteras qu’on a mis un commentaire à côté de chaque champ pour se rappeler à quoi il correspond. Quand on insère une donnée pour la première fois, c’est une bonne pratique de noter les différents champs de la base de données, pour s’en souvenir pour les prochaines fois !

Attention, la fonction insert() n’est plus maintenue, si tu trouve du code l’utilisant il faut la remplacer par insert_one()

Récupérer des données

Il existe de multiples manières de récupérer les données selon ce que l’on veut faire. En voici quelques-unes.

Récupérer toutes les données

Pour récupérer toutes les données on utilise la fonction find() sur un dictionnaire vide.

Note : Si jamais tu as besoin de faire des opérations sur les données ainsi récupérées dans ton code Python, pense à d’abord les convertir en liste avec la fonction list() .
Cependant, dans la plupart des cas tu n’as pas besoin de le faire vu que les données sont simplement transmises à la page web qui l’affichera !

Récupérer toutes les données dont une clef a une certaine valeur

Pour récupérer toutes les données dont la clef à une certaine valeur on utilise la fonction find en précisant la clef et la valeur que l’on veut chercher. Les {} correspondent en effet au filtre de la requête, ce que l’on écrit à l’intérieur permet de filtrer les résultats pour obtenir ce que l’on souhaite !

# Récupère tous les utilisateurs dont l'age est de 18
  utilisateurs = db_utilisateurs.find({"age" : 18})

Un autre exemple où on récupère tous les utilisateurs dont l’âge est de 18

Récupérer une donnée dont une clef a une certaine valeur

Cette fois on utilise la fonction find_one() en précisant la clef et la valeur de l’on veut chercher

Récupérer toutes les données dont une clef contient un mot

Dans les deux cas précédents on cherche si la valeur est exactement la même. Là on veut juste qu’il y ait un mot qui apparaisse dans la valeur.

Pour cela on va d’abord dire que notre clef est une clef de type de texte avec la fonction create_index :

db_toto.create_index( [ ('champ', 'text' ) ] )

Puis on va faire une recherche sur toutes les clefs de type texte avec la syntaxe suivante :

resultat = db_nom_base.find( { '$text' : { '$search' : 'mot_a_chercher' }} )

Et encore...

Il existe plein d’autres manières de rechercher des données, et on peut faire plein d’autres choses, modifier des données , les trier, les supprimer etc. Pour découvrir toutes les fonctions utilisables tu peux consulter la doc :

https://api.mongodb.com/python/current/api/pymongo/collection.html

Mettre à jour une donnée

Pour modifier une donnée, on va utiliser la fonction update_one() sur l’une des lignes de son choix, avec les nouvelles valeurs de son choix.

Pour cela on va déja devoir récupérer la donnée que l’on veux modifier avec une requête. Pour être sur de modifier la bonne donnée, on s’arrangera pour faire une requête sur un champ unique. Le pseudo par exemple, ou l’ID.

Pour l’exemple, on va modifier le mot de passe d’un utilisateur.

On donc l’utilisateur à modifier, et la donnée qui contient cette utilisateur.

Ensuite, il ne reste qu’à définir la modification que l’on souhaite faire.

{« $set »:{‘motDePasse’:NouveauMDP}}
Ici on définit la nouvelle valeur du champ motDePasse.

Ensuite on utilise la fonction update_one(), avec la requête de donnée et la modification à faire.

Supprimer une donnée

Pour supprimer une donnée, on va utiliser la fonction delete_one() sur le champ et la valeur de son choix

Pour éviter de supprimer la mauvaise donnée, on peut utiliser la clef ‘_id’ qui est unique pour chaque donnée.

Quand on récupère la valeur de l’id, on peut avoir une chaine de caractère alors que le type de la valeur attendue est ObjectId. Pour transformer la chaine en ObjectId, il faut importer la librairie suivante :

from bson.objectid import ObjectId

Et utiliser la fonction ObjectId sur la chaine de caractères :

Opérateurs binaires

Il arrive que l’on cherche à faire des requêtes un peu plus compliquées. Par exemple, « récupérer tous les utilisateurs qui dont le pseudo contient Alice ET qui sont connectés ». Ou encore « mettre à jour le champ ‘couleur’ de tous les posts qui datent du 24 Décembre OU du 25 Décembre ».

Ce genre de requête utilise des opérateurs binaires (ET / OU).

Pour utiliser un « ET », on écrira :

{ « $and »: [ { « champ » : « valeur » }, { « champ » : « valeur » } ] }

Le $and signifie que l’on va combiner plusieurs filtres de requête, que l’on renseigne dans une liste (d’où la présence des crochets [] ).

Exemple :

on récupère la case dont la positionX est de 7 ET dont la positionY est de 3

Pour utiliser un « OU », on écrira :

{ « $or »: [ { « champ » : « valeur » }, { « champ » : « valeur » } ] }

Le fonctionnement est le même que pour le « ET ».

Exemple :

on récupère les utilisateurs dont le nom est Lucas OU dont l'âge est de 18