Souper is een Python-tool voor programmeurs. Het biedt een geïntegreerde opslag aan elkaar gebonden met indexen in een catalogus. De records in de opslag zijn generiek. Het is mogelijk om alle gegevens op een plaat op als het persistent pickable in ZODB.
Souper kan gebruikt worden gebruikt in elke python toepassing met behulp van de ZODB, zoals Piramide of Plone.
Met behulp van Souper
Het verstrekken van een Locator
Soepen worden opgezocht door aanpassing souper.interfaces.IStorageLocator om wat context. Souper biedt geen standaard locator. Dus eerst een moeten worden verstrekt. Laten we aannemen dat kader is een aantal hardnekkige dict-achtige bijvoorbeeld:
>>> Van zope.interface import implementator
>>> Van zope.interface import Interface
>>> Van zope.component import provideAdapter
>>> Van souper.interfaces importeren IStorageLocator
>>> Van souper.soup import SoupData
>>>implementer (IStorageLocator)
... Class StorageLocator (object):
...
... Def __init __ (zelf, context):
... Self.context = context
...
... Def opslag (zelf, soup_name):
... Als soup_name niet in self.context:
... Self.context [soup_name] = SoupData ()
... Terugkeer self.context [soup_name]
>>> ProvideAdapter (StorageLocator, past = [Interface])
Dus we hebben locator creëren soepen bij naam op de vlieg. Nu is het gemakkelijk om een soep te krijgen op naam:
>>> Van souper.soup import get_soup
>>> Soep = get_soup ('mysoup', context)
>>> Soep
Het verstrekken van een Catalog Factory
Afhankelijk van uw behoeften van de catalogus en de indexen kan er anders uitzien dan use-case te gebruiken tot geval. De catalogus fabriek is verantwoordelijk voor een catalogus voor een soep te maken. De fabriek is een benoemde hulpprogramma uitvoering souper.interfaces.ICatalogFactory. De naam van het programma dient de dezelfde als de soep.
Hier repoze.catalog wordt gebruikt en om te laten de indexen toegang tot de gegevens van de registers met een sleutel de NodeAttributeIndexer wordt gebruikt. Voor bijzondere gevallen kan men de gewoonte indexeerders schrijven, maar de standaard is prima meest van de tijd:
>>> Van souper.interfaces importeren ICatalogFactory
>>> Van souper.soup import NodeAttributeIndexer
>>> Van zope.component import provideUtility
>>> Van repoze.catalog.catalog import Catalog
>>> Van repoze.catalog.indexes.field import CatalogFieldIndex
>>> Van repoze.catalog.indexes.text import CatalogTextIndex
>>> Van repoze.catalog.indexes.keyword import CatalogKeywordIndex
>>>implementer (ICatalogFactory)
... Class MySoupCatalogFactory (object):
...
... Def __call __ (zelf, context = Geen):
... Catalogus = Catalog ()
... Userindexer = NodeAttributeIndexer ("gebruiker")
... Catalogus [u'user '] = CatalogFieldIndex (userindexer)
... Textindexer = NodeAttributeIndexer ('tekst')
... Catalogus [u'text '] = CatalogTextIndex (textindexer)
... Keywordindexer = NodeAttributeIndexer ('keywords')
... Catalogus [u'keywords '] = CatalogKeywordIndex (keywordindexer)
... Return catalogus
>>> ProvideUtility (MySoupCatalogFactory (), naam = "mysoup")
De catalogus fabriek wordt alleen gebruikt soep-intern, maar men kan willen controleren of het werkt prima:
>>> Catalogfactory = getUtility (ICatalogFactory, naam = 'mysoup')
>>> Catalogfactory
>>> Catalogus = catalogfactory ()
>>> Naargelang (catalog.items ())
[(U'keywords ',
(U'text ',
(U'user ',
Het toevoegen van gegevens
Zoals hierboven souper.soup.Record genoemd is de enige soort gegevens toegevoegd aan de soep. Een record heeft attributen die de gegevens bevat:
>>> Van souper.soup import get_soup
>>> Van souper.soup import Record
>>> Soep = get_soup ('mysoup', context)
>>> Opnemen = Record ()
>>> Record.attrs ['user'] = 'gebruiker1'
>>> Record.attrs ['text'] = u'foo bar baz '
>>> Record.attrs ['keywords'] = [u'1 ', U'2', u '& uuml;']
>>> Record_id = soup.add (record)
Een record kan bevat andere documenten. Maar te indexeren hen zou een aangepaste indexer nodig, dus normaal gezien conatined platen zijn waardevol voor latere weergave, niet voor het zoeken:
>>> Record ['subrecord'] = Record ()
>>> Record ['thuisadres']. Attrs ['zip'] = '6020'
>>> Record ['thuisadres']. Attrs ['stad'] = 'Innsbruck'
>>> Record ['thuisadres']. Attrs ['land'] = 'Oostenrijk'
Toegang tot de gegevens
Zelfs zonder een query een record kan worden opgehaald door id:
>>> Van souper.soup import get_soup
>>> Soep = get_soup ('mysoup', context)
>>> Opnemen = soup.get (record_id)
Alle records kunnen worden opgeroepen met behulp van de container btree:
>>> Soup.data.keys () [0] == record_id
Waar
Query-gegevens
Hoe maak je een repoze catalogus opvragen is goed gedocumenteerd. Sorteren werkt hetzelfde ook. Query's worden doorgegeven aan soepen query-methode (die dan repoze catalogus gebruikt). Het geeft een generator:
>>> Van repoze.catalog.query import Eq
>>> [R voor r in soup.query (Vgl ("gebruiker", "user1 '))]
[
>>> [R voor r in soup.query (Vgl ("gebruiker", "nonexists '))]
[]
Om ook de grootte van het resultaat set te krijgen passeren een with_size = Trouw aan de query. Het eerste item geretourneerd door de generator is de grootte:
>>> [R voor r in soup.query (Vgl ("gebruiker", "user1 '), with_size-Ware)]
[1,
Om te optimaliseren behandeling van grote resultaat sets kan men niet om het record, maar een generator terugkerende lichtgewicht objecten te halen. Records worden opgehaald op afroep:
>>> Lui = [l voor l in soup.lazy (Vgl ('naam', 'name'))]
>>> Lui
[
>>> Lui [0] ()
Hier de grootte wordt doorgegeven als eerste waarde van de geneartor ook als with_size = True wordt doorgegeven.
Een record verwijderen
Om een record uit de soep python del wordt gebruikt zoals men zou doen op een dict verwijderen:
>>> Del soep [record_id]
Reindex
Na een registreert gegevens veranderd het moet een reindex:
>>> Record.attrs ['user'] = 'gebruiker1'
>>> Soup.reindex (platen = [RECORD])
Soms wil men alle gegevens te indexeren. Vervolgens opnieuw indexeren heeft genoemd te worden zonder parameters. Het kan een tijdje duren:
>>> Soup.reindex ()
Rebuild catalogus
Meestal gemaakt na een wijziging van de catalogus fabriek werd gemaakt - dat wil zeggen sommige index werd toegevoegd - een verbouwing van de catalogus die ik nodig had. Het vervangt de huidige catalogus met een nieuwe gecreëerd door de catalogus fabriek en reindexes alle gegevens. Het kan even duren:
>>> Soup.rebuild ()
Reset (of uit) de soep
Als u alle gegevens van de soep en leeg te verwijderen en de catalogus gesprek duidelijk te herbouwen. Let op: alle gegevens verloren gaan!
>>> Soup.clear ()
Installatie Notes
Om souper node.ext.zodb gebruik nodig is. Aangezien deze beta werd uitgebracht was er geen vrijgave (zal binnenkort worden gedaan). Controleer pypi als het er is, anders kunt halen node.ext.zodb van GitHub
Wat is nieuw in deze release:.
- PEP-8. [Rnix, 2012/10/16]
- Python 2.7 ondersteuning. [Rnix, 2012/10/16]
- Fix documentatie.
Eisen
- Python
Reacties niet gevonden