URL: https://linuxfr.org/users/_moumoutte/journaux/apres-le-sucre-le-json Title: Après le sucre, le JSON ! Authors: Guillaume Camera Date: 2013年02月04日T01:58:27+01:00 License: CC By-SA Tags: Score: 11 Cher Nal' Je sais pas si tu te souviens, mais la semaine dernière j'avais chuchoté dans le creux de ton oreille, que j'ai écrit une petite bibliothèque pour faire un peu de sucre syntaxique autour d'SQLAlchemy : [Un peu de sucre pour une meilleure alchimie ?](http://linuxfr.org/users/_moumoutte/journaux/un-peu-de-sucre-pour-une-meilleure-alchimie). Un commentaire d'amélioration a retenu mon attention. Et j'ai, depuis, commité les changements pour que le sucre soit encore un peu plus sucré. Maintenant on peut faire : ```python >>> MyObj.all() >>> MyObj.get(id=2) >>> MyObj.filter(name__like='toto') ``` Au lieu de : ```python >>> MyObj.all(session) >>> MyObj.get(session, id=2) >>> MyObj.filter(session, status__name='toto') ``` C'est quand même un peu plus cool non ? Et en plus de ça, j'ai mis la doc sur [RTD](https://sqla_helpers.readthedocs.org/en/latest/sqla_helpers.html). Mais je ne me suis pas arrêté là puis que j'ai ajouté quelques petites fonctionnalités qui permettent de charger ou de dumper un objet depuis/vers un dictionnaire python. C'est notamment fait pour faciliter les échanges de données au format JSON. Ce qui peut être pratique quand on fait un peu de web. ```python >>> obj = MyObj.get(id=1) >>> import json >>> json.dumps(obj.dump(), indent=4) { "status": { "id": 1, "name": "Ok" }, "status_id": 1, "id": 1, "name": "Great Obj" } >>> obj = MyObj.load({'id': 1, 'name': 'Bigger Obj'}) >>> json.dumps(obj.dump(), indent=4) { "status": { "id": 1, "name": "Ok" }, "status_id": 1, "id": 1, "name": "Bigger Obj" } >>> session.commit() >>> obj = MyObj.get(id=1) >>> obj.id, obj.name (1, "Bigger Obj") ``` Du coup, en imaginant que le client HTTP envoit une rêquete POST vers /obj/1/save/ Avec un POST qui ressemblerait à ça : ```javascript { 'obj': { 'id': 1 'name': 'toto' 'status': { .... } } } ``` On peut se contenter de faire du côté du serveur: ```python def save_obj(request): obj = MyObj.load(request.POST['obj']) session.add(obj) session.commit() return HTTPOk(body=obj.dump(), content_type='application/JSON') ``` La méthode load s'occupe de récupérer en base les objets et les sous-objets si les attributs qui composent la clef primaire sont présents (`id` dans l'exemple). Sinon, elle créée une nouvelle instance d'objet. Ainsi plus besoin de programmer manuellement le mis-à-jour où l'ajout des objets en relation, on peut simplement passé un dictionnaire qui représente la structure des objets. Encore une fois cher journal, si tu connais des bibliothèques qui font ça mieux que moi, je suis preneur !