TinyDB, la base de données pure python

Posté le 06/11/2015 dans Python

TinyDB

TinyDB, ce n'est pas la base de données qui va tout révolutionner, mais c'est le petit outil sympa à avoir à portée de main.

Elle est orientée document, comme MongoDB, en se basant sur des fichiers JSON.

Le code est écrit en pure python, sans besoin d'aucune dépendance, et est compatible python 2 et 3.

Niveau utilisation, il ne faut pas espérer des perfs de malade ; ce n'est pas fait pour ça.

Par contre, si tu as besoin d'une mini BDD pour afficher des news sur un site, ça fera l'affaire.

Personnellement, je l'utilise plutôt lors de la rédaction de tests unitaires, lorsque j'ai besoin d'une batterie de données de test.

Pour l'utiliser, tu l'installes via pip:

pip install tinydb

Tu crées, par exemple, une base de données contenant des légumes:

>>> from tinydb import TinyDB
>>> db = TinyDB('meslegumes.json')

Le fichier meslegumes.json correspond à ta base de données et s'est créé dans le répertoire courant.

Tu crées alors une table legumes. Évite les caractères spéciaux dans le nom de la table, ça peut poser problème:

>>> table = db.table('legumes')

Tu vas maintenant insérer des légumes via la méthode insert:

>>> table.insert({'type': 'carotte', 'nombre': 5})
>>> table.insert({'type': 'patate', 'nombre': 6})
>>> table.insert({'type': 'navet', 'nombre': 2})

En affichant tous les éléments de ta table, tu verras tes légumes:

>>> table.all()
[{u'nombre': 5, u'type': u'carotte'},
 {u'nombre': 6, u'type': u'patate'},
 {u'nombre': 2, u'type': u'navet'}]

Tu peux désormais utiliser un langage de requête. Par exemple, si tu veux récupérer toutes les carottes:

>>> from tinydb import where
>>> table.search(where('type') == 'carotte')
[{u'nombre': 5, u'type': u'carotte'}]

Ou tous les légumes qui sont plus de deux:

>>> table.search(where('nombre') > 2)
[{u'nombre': 5, u'type': u'carotte'}, {u'nombre': 6, u'type': u'patate'}]

Tu peux utiliser le ET et le OU logique, pour combiner tes requêtes lors de ta recherche de légumes:

>>> table.search((where('nombre') > 2) & (where('nombre') < 6))
[{u'nombre': 5, u'type': u'carotte'}]
>>> table.search((where('nombre') < 3) | (where('nombre') > 5))
[{u'nombre': 6, u'type': u'patate'}, {u'nombre': 2, u'type': u'navet'}]

Tu peux évidemment mettre à jour tes navets:

>>> table.update({'nombre': 10}, where('type') == 'navet')
>>> table.search(where('type') == 'navet')
[{u'nombre': 10, u'type': u'navet'}]

Et supprimer tes carottes:

>>> db.remove(where('type') == 'carotte')
>>> table.all()
[{u'nombre': 6, u'type': u'patate'}, {u'nombre': 10, u'type': u'navet'}]

Ou carrément vider tous tes légumes:

>>> table.purge()
>>> table.all()
[]

Voilà pour les bases! Pour un usage simple, ça devrait te suffire.

Il existe d'autres opérations pour le langage de requête comme insert_multiple, delete, increment, decrement, get, contains, count.

Tu peux également stocker les légumes en mémoire à la place du fichier json:

>>> from tinydb.storages import MemoryStorage
>>> db = TinyDB(storage=MemoryStorage)

Et utiliser des middlewares, pour faire du cache par exemple:

>>> from tinydb.storages import JSONStorage
>>> from tinydb.middlewares import CachingMiddleware
>>> db = TinyDB('meslegumes.json', storage=CachingMiddleware(JSONStorage))

Enfin, il est également possible de customiser TinyDB en écrivant ton propre Serializer, ou d'écrire une implémentation YAML pour le stockage des données à la place de JSON, ou encore d'écrire tes propres Middlewares.