CouchDB & Django avec CouchDBkit
Benoît Chesneau25/04/2010 - djangocong
Sunday, April 25, 2010
[email protected] webMinimal web & OpensourceEnki Multimediahttp://www.e-engura.com
benoît chesneau
Sunday, April 25, 2010
• Pourquoi utiliser une solution “NoSQL” ?
• CouchDB
• CouchDBKit: CouchDB & Django
Sunday, April 25, 2010
• On a pas forcement besoin de “scalabilité”
• Maj des bases de données < 300 Go (2 Go)
• Souvent les requêtes sont rapides
• Tout tient sur une machine
Pourquoi ?
Sunday, April 25, 2010
Souplesse
• Differents types de contenu
• Supprimer les “content-types”
• Faire de la dénormalisation simplement
• Gérer la migration de données/schema facilement
Sunday, April 25, 2010
Garder ses données
Sunday, April 25, 2010
CommandeDonnéesclients Livraison
Item Item
Ex: boutique en ligne
Sunday, April 25, 2010
• Gérer des differents produits
• Sauver une commande avec le détail des produits
• à un instant T (le produit est figé)
• Ne pas perdre la commande
• Ne pas perdre les infos de livraisons et clients
Sunday, April 25, 2010
• Base de données orientées document
• REST
• Map/Reduce (M/R)
• Append-Only
• Javascript/Erlang
• Réplication
CouchDB
Sunday, April 25, 2010
Orientée Document?
• Pas de schema
• JSON
• Attachements
Sunday, April 25, 2010
DOCUMENT JSON
{ "_id": "foo", "_rev": "1-....", "url": "http://apache.couchdb.org", "vote": 1}
Sunday, April 25, 2010
Map/Reduce ?
• Map (M) : Collecter une liste de valeurs en fonction d’une clé
• Retourne une liste de clés/valeurs (K/V)
• Reduce (R) : Réduire une liste de clés/valeurs en une liste de valeurs
• Rereduce
Sunday, April 25, 2010
MAP.JSfunction(doc) { if (doc.url && doc.vote) emit(doc.url, doc.vote);}
{ "total_rows":3, "offset":0, "rows": [ { "id":"15c92051cc81d564db4337a05087bc8d", "key":"http://apache.couchdb.org", "value":1 }, { "id":"fa9658810d25cac893748e4ff15e7253", "key":"http://apache.couchdb.org", "value":1 }, { "id":"1fa0c68d8455196507b8b01645e65186", "key":"http://mysql.com", "value":-1 }]}Sunday, April 25, 2010
REDUCE.JSfunction(keys, values, rereduce) { return sum(values);}
{ "rows":[ { "key": "http://mysql.com", "value": -1 }, { "key": "http://apache.couchdb.org", "value": 2 }]}
jsonresult
Sunday, April 25, 2010
FutonSunday, April 25, 2010
Réplicatuon
• Incrémentale
• Master-Master
• Continue ou à la demande
Sunday, April 25, 2010
Sunday, April 25, 2010
Sunday, April 25, 2010
Sunday, April 25, 2010
Sunday, April 25, 2010
Sunday, April 25, 2010
Sunday, April 25, 2010
Sunday, April 25, 2010
Sunday, April 25, 2010
CouchDBKit
• CouchDB Python framework
• supporte CouchDB 0.10.2 & 0.11.0
• Client simple
• Schema
• Extension django
• Compatible couchapp
Sunday, April 25, 2010
from couchdbkit import Server
s = Server("http://127.0.0.1:5984")db = s["mydb"]
doc = { "a": 1 }db.save_doc(doc)
doc["b"] = 2
db.save(doc)
doc1 = db.get(doc['_id'])
client
Sunday, April 25, 2010
Autres fonctions
• db.views
• from couchdbkit.loaders import FileSystemDocsLoader
Sunday, April 25, 2010
from couchdbkit.loaders import FileSystemDocsLoader
loader = FileSystemDocsLoader('/path/to/example/_design')loader.sync(db, verbose=True)
Sunday, April 25, 2010
schemafrom couchdbkit.schema import *
class MyDoc(Document): a = IntegerProperty() contain(db, MyDoc)
doc = MyDoc()doc.a = 1doc.save()
doc.b = 2doc.save()
doc1 = MyDoc.get(doc._id)
Sunday, April 25, 2010
Extension Django
• from couchdbkt.ext.django import *
• Django helper
• manage.py syncdb
• DocumentForm
Sunday, April 25, 2010
settings.py...
COUCHDB_DATABASES = ( ('djangoapp.greeting', 'http://127.0.0.1:5984/greeting'), ) ... INSTALLED_APPS = ( .... 'couchdbkit.ext.django', 'djangoapp.greeting', .... )
Sunday, April 25, 2010
models.py
from datetime import datetimefrom couchdbkit.ext.django.schema import * class Greeting(Document): author = StringProperty() content = StringProperty(required=True) date = DateTimeProperty(default=datetime.utcnow)
Sunday, April 25, 2010
forms.py
class GreetingForm(DocumentForm): class Meta: document = Greeting
Sunday, April 25, 2010
views.pydef home(request): greet = None if request.POST: form = GreetingForm(request.POST) if form.is_valid(): greet = form.save() else: form = GreetingForm() greetings = Greeting.view("greeting/all") return render("home.html", { "form": form, "greet": greet, "greetings": greetings }, context_instance=RequestContext(request))
Sunday, April 25, 2010
0.5
• Nouveau mapper àla sqlalchemy
• Intégration de futon dans l’admin
• Gestion de design docs ameliorée
• Support Eventlet
• ...
Sunday, April 25, 2010
Sunday, April 25, 2010
Liens
• http://apache.couchdb.org
• http://couchdbkit.org
Sunday, April 25, 2010
Questions
Sunday, April 25, 2010
@benoitc
Sunday, April 25, 2010
Cette création est mise à disposition selon le Contrat Paternité 2.0 France disponible en ligne http://
creativecommons.org/licenses/by/2.0/fr/ ou par courrier postal à Creative Commons, 171 Second Street, Suite
300, San Francisco, California 94105, USA.
Sunday, April 25, 2010