micromongo is een klein laagje rond pymongo die u toelaat om eenvoudig ORM-stijl klassen die validatie kan uitvoeren, laat dot toegang tot documenten, auto-wrap queryset resultaten, en geven u pre / post save haken creëren.
Het is ontworpen met microframeworks in het achterhoofd, maar is de toepassing en het kader agnost. Het is bedoeld om het gebruik van pymongo vereenvoudigen en instrumenten verschaffen voor een gemeenschappelijke idiomen, niet te pymongo of MongoDB verduisteren van uw data structuren.
U bent van harte welkom om zaken te openen of stuur pull verzoeken op GitHub micromongo's
micromongo maakt een paar ontwerpbeslissingen in de naam van de vereenvoudiging die niet zou kunnen werken voor u:
& Nbsp; - & nbsp; micromongo onderhoudt een enkele wereldwijde verbinding, dus je kunt niet modellen die aansluiten op meerdere MongoDB servers hebben
& Nbsp; - & nbsp; er zijn een handvol model namen en document attribuut namen die niet zal werken met micromongo modellen; deze zullen worden behandeld in de volledige documentatie
& Nbsp; - & nbsp; je kunt slechts één model per collectie
Aan de slag
Om te beginnen met micromongo, gewoon importeren:
>>> Van micromongo invoer aansluiten, Model
>>> C = connect ()
connect neemt dezelfde argumenten als Connection object pymongo's, en gedraagt zich bijna identiek, behalve dat het probeert om automatisch query resultaten verpakt in het juiste model klassen terug. De verbinding object dat u maakt via deze oproep zal worden gecached en gebruikt door de verschillende ORM-stijl faciliteiten, zoals Model.save (), Model.proxy, etc. Als je een schone, standaard Connection object wilt, kunt u een gemakkelijk :
>>> Van micromongo import clean_connection
>>> Schoon = clean_connection ()
Merk op dat clean_connection geen argumenten te nemen en zal altijd een schone Connection klasse terug te keren met dezelfde instellingen als de huidige micromongo verbinding.
Met deze aansluiting objecten, kunt u databases maken of doen wat je zou doen met een normale pymongo objecten:
>>> Db = c.test_db
>>> Collectie = db.test_collection
>>> Collection.save ({"docid": 1, "fail": Valse})
>>> Collection.find_one ()
{U'_id ': ObjectID (' ... '), u'fail': Valse, u'docid ': 1}
U kunt ook verklaren uw eigen model voor een bepaalde collectie in declaratieve stijl:
>>> Klasse testmodel (Model):
& Nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; verzameling = 'test_db.test_collection'
>>> Collection.find_one ()
Deze klassen hebben een aantal nieuwe functies in een woordenboek die ze veel handiger in gebruik. Het document toetsen zijn allemaal toegankelijk als attributen:
>>> T = collection.find_one ()
>>> T.fail
Vals
>>> T.docid
1
De documenten zijn ook gemakkelijk volhardde in de database:
>>> T.docid = 17
>>> T.save ()
>>> Clean.test_db.test_collection.find_one ()
{U'_id ': ObjectID (' ... '), u'fail': Valse, u'docid ': 17}
definiëren modellen
Boven, werd de collectie attribuut toegewezen aan onze Foo model. Dit was echter een kortere weg; als database en collectie afzonderlijk worden toegewezen, kan de Model achterhalen van de volledige collectie naam. Als de collectie en database niet aanwezig zijn, micromongo probeert te achterhalen op basis van de klasse en module naam van uw model. Zo zal blog.Post blog.post worden, of stream.StreamEntry zal stream.stream_entry geworden. Expliciet is beter dan impliciet, en het is bemoedigend dat u de collectie handmatig in te stellen.
Naast het inpakken en uitpakken van de resultaten uit de database, kunnen modellen ook een spec document dat standaardwaarden kunnen definiëren en validatie uit te voeren voordat het opslaan van het model te definiëren. Neem een triviale blogpost model:
>>> Van micromongo.spec import *
>>> Klasse Post (Model):
& Nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; verzameling = 'test_db.blog_posts'
& Nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; spec = dict (
& Nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; author = Veld (verplicht = True, default = 'jmoiron', type = basestring),
& Nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; title = Field (verplicht = False, default = '', type = basestring),
& Nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; gepubliceerd = Veld (verplicht = True, default = false, type = [True, False]),
& Nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; body = Field (type = unicode),
& Nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; timestamp = Veld (),
& Nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; )
>>> P = Post.new ()
>>> P
Een paar dingen zijn hier aan de hand. Velden die standaard worden geïnitialiseerd op dat standaard of zij nodig zijn of niet. Als een verplicht veld een standaard heeft, het is geïnitialiseerd op Geen.
Velden kan een argument type, die ofwel een vervroegd aflosbaar dat een waarde heeft en geeft Waar of niet waar, een of meer base types, of één of meer waarden kunnen nemen. Indien één of meer types worden voorzien, wordt isinstance gebruikt om te testen dat waarden het juiste type. Als een of meer waarden worden verstrekt, het gebied fungeert als een soort enum, controleren dat waarden in zijn set waarden. Als er geen type wordt gegeven, validatie loopt altijd op een veld, tenzij het nodig is en afwezig.
Als een veld in p gegeven een ongeldig, dan is een ValueError wordt verhoogd:
>>> P.title = 10
>>> Bespaarstand ()
Traceback (meest recente oproep vorige):
& Nbsp; ...
ValueError: Keys kwam niet overeen spec: ['titel']
>>> Del p.author
>>> Bespaarstand ()
Traceback (meest recente oproep vorige):
& Nbsp; ...
ValueError: Ontbrekende velden: ['auteur'], Ongeldige velden: ['titel']
>>> P.title = 'Mijn eerste blogpost'
>>> P.author = 'jmoiron'
>>> P.published = True
>>> P.body = u "Dit is mijn eerste blog post .. & nbsp; Ik ben zo opgewonden!"
>>> Bespaarstand ()
Model.find
Voor het gemak en droog, Model.find is een classmethod dat de cursor micromongo's zal gebruiken om een vondst tegen de juiste collectie uit te geven. Deze methode gedraagt zich hetzelfde als pymongo's Collection.find.
micromongo's enigszins aangepast Cursor klasse maakt ook een-django geïnspireerd order_by methode beschikbaar voor alle cursors (te vinden en alles wat je ketting uit als het een cursor keert terug). U kunt passeren één of meerdere veldnamen, met een optionele toonaangevende '-', om dingen te sorteren op oplopende of aflopende volgorde.
Deze wijzigingen kunt u het grootste deel van de kracht van pymongo te gebruiken zonder dat het te importeren, en laat je vermijden onnodige herhaling van de locatie van uw gegevens.
veld subclassing
U wordt aangemoedigd om je eigen Velden die doen wat je wilt creëren. Veld subklassen hebben een haak functie pre_validate die een inkomende waarde te nemen en kan deze overgaan maar ze willen. Merk op dat dit alleen werkt als de velden daadwerkelijk aanwezig zijn; zo iets als een auto_now_add op een DateTimeField krijgen, zal u wilt maken het nodig is en hebben haar pre_validate zetten Geen in datetime.datetime.now ()
Eisen .
- Python
Reacties niet gevonden