Couchdbkit & Dango

Preview:

DESCRIPTION

presentation about the use of couchdbkit in django at @djangocong

Citation preview

CouchDB & Django avec CouchDBkit

Benoît Chesneau25/04/2010 - djangocong

Sunday, April 25, 2010

benoitc@apache.orgArtisan 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

Recommended