Souper er en Python verktøy for programmerere. Det tilbyr en integrert lagring bundet sammen med indekser i en katalog. Postene på lagrings er generiske. Det er mulig å lagre data på en plate hvis det er vedvarende pickable i ZODB.
Souper kan brukes brukes i alle python program som bruker ZODB, for eksempel Pyramid eller Plone.
Ved hjelp Souper
Gi en Locator
Supper er så opp ved å tilpasse souper.interfaces.IStorageLocator til noen sammenheng. Souper gir ikke noen standard locator. Så først en trenger å bli gitt. La oss anta sammenheng er noen vedvarende dict-lignende eksempel:
>>> Fra zope.interface import iverks
>>> Fra zope.interface import Interface
>>> Fra zope.component import provideAdapter
>>> Fra souper.interfaces importere IStorageLocator
>>> Fra souper.soup import SoupData
>>>implementer (IStorageLocator)
... Klasse StorageLocator (objekt):
...
... Def __init __ (selv, kontekst):
... Self.context = sammenheng
...
... Def lagring (selv, soup_name):
... Hvis soup_name ikke i self.context:
... Self.context [soup_name] = SoupData ()
... Retur self.context [soup_name]
>>> ProvideAdapter (StorageLocator, tilpasser = [Interface])
Så vi har locator lage supper etter navn på fly. Nå er det lett å få en suppe etter navn:
>>> Fra souper.soup import get_soup
>>> Suppe = get_soup ('mysoup', kontekst)
>>> Suppe
Gi en Catalog Factory
Avhengig av dine behov katalogen og dens indekser kan se annerledes ut enn bruk-case å bruke-saken. Katalogen fabrikken er ansvarlig for å lage en katalog for en suppe. Fabrikken er en navngitt verktøyet implementere souper.interfaces.ICatalogFactory. Navnet på verktøyet har den samme som den suppen har.
Her repoze.catalog er brukt og å la indeksene tilgang til dataene på poster ved nøkkel NodeAttributeIndexer brukes. For spesielle tilfeller kan man skrive sine egne indexers, men standard er greit mesteparten av tiden:
>>> Fra souper.interfaces importere ICatalogFactory
>>> Fra souper.soup import NodeAttributeIndexer
>>> Fra zope.component import provideUtility
>>> Fra repoze.catalog.catalog import Catalog
>>> Fra repoze.catalog.indexes.field import CatalogFieldIndex
>>> Fra repoze.catalog.indexes.text import CatalogTextIndex
>>> Fra repoze.catalog.indexes.keyword import CatalogKeywordIndex
>>>implementer (ICatalogFactory)
... Klasse MySoupCatalogFactory (objekt):
...
... Def __call __ (selv, context = Ingen):
... Katalogen = Catalog ()
... Userindexer = NodeAttributeIndexer ("bruker")
... Katalogen [u'user '] = CatalogFieldIndex (userindexer)
... Textindexer = NodeAttributeIndexer ('tekst')
... Katalogen [u'text '] = CatalogTextIndex (textindexer)
... keywordindexer = NodeAttributeIndexer ("søkeord")
... Katalog [u'keywords '] = CatalogKeywordIndex (keywordindexer)
... Retur katalog
>>> ProvideUtility (MySoupCatalogFactory (), name = "mysoup")
Katalogen fabrikken brukes suppe interne bare, men man kan være lurt å sjekke om det fungerer greit:
>>> Catalogfactory = getUtility (ICatalogFactory, name = 'mysoup')
>>> Catalogfactory
>>> Katalog = catalogfactory ()
>>> sortert (catalog.items ())
[(u'keywords ',
(U'text ',
(U'user ',
Legge poster
Som nevnt ovenfor souper.soup.Record er den eneste form for data lagt til suppen. En rekord har attributter som inneholder data:
>>> Fra souper.soup import get_soup
>>> Fra souper.soup import Record
>>> Suppe = get_soup ('mysoup', kontekst)
>>> Rekord = Opptak ()
>>> record.attrs ['user'] = 'bruker1'
>>> record.attrs ['tekst'] = u'foo bar baz '
>>> record.attrs ['søkeord'] = [u'1 ', u'2', u '& uuml;']
>>> Record_id = soup.add (rekord)
En rekord kan inneholder andre poster. Men å indeksere dem en trenger en tilpasset indekser, så usally conatined poster er verdifulle for senere visning, ikke for å søke:
>>> Rekord ['Underarkiv'] = Opptak ()
>>> rekord ['homeaddress']. attrs ['zip'] = '6020'
>>> rekord ['homeaddress']. attrs ['by'] = 'Innsbruck'
>>> Rekord ['homeaddress']. Attrs ['landet'] = 'Austria'
Tilgangsdata
Selv uten noen spørsmål en rekord kan bli hentet av id:
>>> Fra souper.soup import get_soup
>>> Suppe = get_soup ('mysoup', kontekst)
>>> Rekord = soup.get (record_id)
Kan nås alle rekorder ved hjelp utnytte beholderen BTree:
>>> soup.data.keys () [0] == record_id
Sann
Spørring data
Hvordan å spørre en repoze katalogen er dokumenteres godt. Sorteringen fungerer på samme måte også. Spørsmål sendes til supper spørring metode (som bruker deretter repoze katalogen). Den returnerer en generator:
>>> Fra repoze.catalog.query import Eq
>>> [R for r i soup.query (Eq ('bruker', 'bruker1'))]
[
>>> [R for r i soup.query (Eq ('bruker', 'nonexists'))]
[]
Å få også størrelsen på resultatsettet passere en with_size = True til søket. Det første elementet returneres av generatoren er den størrelse
>>> [R for r i soup.query (Eq ('bruker', 'bruker1'), with_size-sann)]
[1,
For å optimalisere håndtering av store resultatsett kan man ikke å hente posten, men en generator retur lette gjenstander. Postene er hentet på vakt:
>>> Lat = [l for l i soup.lazy (Eq ('navn', 'navn'))]
>>> Lat
[
>>> Lat [0] ()
Her størrelsen er gått som første verdien av geneartor også hvis with_size = sant er passert.
Slette en rekord
Slik fjerner du en rekord fra suppen python del brukes slik man gjør på noen dict:
>>> Del suppe [record_id]
Reindex
Etter en poster data endret den trenger en Reindex:
>>> record.attrs ['user'] = 'bruker1'
>>> Soup.reindex (poster = [rekord])
Noen ganger kan man ønske å indeksere alle data. Deretter indeksere har å bli kalt uten parametere. Det kan ta en stund:
>>> Soup.reindex ()
Gjenoppbygge katalog
Usally etter en endring av katalog Fabrikken ble gjort - det vil si noen indeksen ble lagt til - en gjenoppbygging av katalogen jeg trengte. Den erstatter den nåværende katalog med en ny skapt av katalog fabrikken og reindekserer alle data. Det kan ta tid;
>>> Soup.rebuild ()
Tilbakestill (eller fjerne) suppe
Hvis du vil fjerne alle data fra suppe og tom og gjenoppbygge katalogen samtalen klart. Oppmerksomhet: alle data er tapt!
>>> Soup.clear ()
Installasjonsmerknader
For å kunne bruke souper node.ext.zodb er nødvendig. Som denne beta ble sluppet var det ingen utgivelse (vil bli gjort snart). Vennligst sjekk PyPI hvis det er der, ellers kan du hente node.ext.zodb fra github
Hva er nytt i denne utgaven:.
- PEP-8. [Rnix, 2012-10-16]
- Python 2.7 støtte. [Rnix, 2012-10-16]
- Fix dokumentasjon.
Krav :
- Python
Kommentarer ikke funnet