UKOnline

Base de données

On peut utiliser des dictionnaires pour construire des simples bases de données. Une base de données est une collection de données organisées selon un format choisi. La gestion de ces données est confiée à un système de gestion de bases de données (SGBD), un ensemble de logiciels permettant notamment d'interroger la base de données pour en extraire des informations et de gérer le stockage physique de ces données.

Format JSON

Le format JSON (acronyme de JavaScript Object Notation, ce format provient du monde JavaScript) est utilisé pour représenter des objets. C'est un format qui dérive de la notation des objets du langage JavaScript. Il est utilisé pour représenter de l'information structurée et, comme vous pourrez le constater, ressemble fort aux dictionnaires Python.

Un document JSON est un ensemble de paires constituées d'une étiquette et d'une valeur ou d'une liste de valeurs. On sépare les paires par des virgules, le tout entre accolades. Pour les listes de valeurs, on sépare les valeurs par des virgules, le tout entre crochets. Enfin, une valeur peut elle-même être un document JSON et les étiquettes doivent être écrites entre guillemets doubles (vous pouvez vérifier la validité d'un document JSON en ligne, à l'adresse suivante : http://jsonlint.com/).

Voici un exemple de document JSON qui représente un carnet de contacts, reprenant leurs nom, prénom et numéro de téléphone :

Ce document JSON contient, à la base, deux paires dont les étiquettes sont name et contacts. La valeur de la première paire est une chaine de caractères et celle de la seconde paire est une liste de documents JSON. Elle en contient trois identiques contenant chacun trois étiquettes (firstname, lastname et phone) dont les valeurs sont des chaines de caractères pour les deux premières et un nombre entier pour la troisième.

Base de données orientée document

Les documents JSON sont utilisés pour construire des bases de données orientée document. Dans de telles bases de données, les éléments stockés peuvent être des documents JSON. Un tel type de base de données supporte essentiellement quatre opérations que l'on résume avec l'acronyme CRUD (Create, Read, Update, and Delete) :

  • création et ajout d'un nouveau document ;
  • lecture et récupération d'un document par une recherche ;
  • mise à jour d'un document existant par modification, ajout ou suppression de paires ;
  • suppression d'un document existant.

Ces quatre opérations sont nécessaires pour avoir un système complet. Si on considère l'implémentation d'une base de données orientée documents à l'aide de Python, en utilisant les dictionnaires pour stocker les documents JSON, il est assez simple d'implémenter ces quatre opérations à l'aide de celles utilisables sur les dictionnaires.

Sérialisation et désérialisation

Un document JSON peut toujours être transformé en un dictionnaire Python; cette opération s'appelle la désérialisation. L'opération inverse, appelée sérialisation, tente de convertir un dictionnaire Python en un document JSON. Cette seconde opération n'est pas toujours possible, les dictionnaires Python étant plus riches que ce qui est permis en JSON. On relève notamment les différences majeures suivantes :

  • les étiquettes des paires d'un document JSON doivent être des chaines de caractères alors qu'elles peuvent être n'importe quelle donnée non modifiable dans un dictionnaire Python ;
  • les types de données autorisés pour les valeurs des paires d'un document JSON sont limités aux chaines de caractères, booléens, nombres entiers et flottants, listes et documents JSON imbriqués alors qu'il y a beaucoup plus de types autorisés dans un dictionnaire Python.

Les deux opérations de sérialisation et de désérialisation peuvent être faites à partir de fonctions disponibles dans le module json. La fonction dumps correspond à la sérialisation et la fonction loads désérialise un document JSON.

Le premier exemple construit un dictionnaire Python et le sérialise en un document JSON qui est ensuite affiché. Le résultat renvoyé par la fonction dumps est de type chaine de caractères :

Le paramètre nommé indent de la fonction dumps permet d'obtenir un joli formatage du document JSON, comme on le voit sur le résultat de l'exécution :

<class 'str'>
{
    "Breaking Bad": {
        "genre": [
            "crime drama",
            "thriller"
        ],
        "seasons": 5
    },
    "Skins": {
        "genre": [
            "teen drama",
            "comedy drama"
        ],
        "seasons": 7
    }
}

Voyons maintenant l'opération inverse, à savoir la création d'un dictionnaire Python à partir d'une chaine de caractères contenant un document JSON. On utilise donc pour cela la fonction loads comme le montre l'exemple suivant :

La variable countries, qui stocke le résultat renvoyé par la fonction loads, contient bien un dictionnaire comme on peut le constater sur le résultat de l'exécution :

<class 'dict'>
{'languages': ['mandarin chinese'], 'capital': 'Beijing'}

Les deux fonctions dumps et loads provoquent une erreur lors de l'exécution lorsqu'un problème de format de donnée est présent. La sérialisation échouera si le dictionnaire Python passé en paramètre comporte des éléments interdit par le format JSON. La désérialisation échouera si la chaine de caractères passée en paramètre ne représente pas un document JSON valide.