Souper é uma ferramenta Python para programadores. Ele oferece um armazenamento integrado amarrado junto com índices em um catálogo. Os registros no armazenamento são genéricos. É possível armazenar todos os dados em um registro, se for pickable persistente no ZODB.
Souper pode ser usado usado em qualquer aplicação python usando o ZODB, como pirâmide ou Plone.
Usando Souper
Fornecendo um Localizador
Sopas são procurados pela adaptação souper.interfaces.IStorageLocator a algum contexto. Não Souper não presta qualquer localizador padrão. Então, primeiro precisa ser fornecido. Vamos supor que o contexto é alguma instância dict-like persistente:
>>> From zope.interface importação implementador
>>> From zope.interface interface de importação
>>> From zope.component provideAdapter importação
>>> From souper.interfaces importar IStorageLocator
>>> From SoupData importação souper.soup
>>>implementer (IStorageLocator)
... Class StorageLocator (objeto):
...
... Def __init __ (self, contexto):
... Self.context = contexto
...
... Def armazenamento (self, soup_name):
... Se soup_name não em self.context:
... Self.context [soup_name] = SoupData ()
... Retorno self.context [soup_name]
>>> ProvideAdapter (StorageLocator, adapta = [Interface])
Portanto, temos locator criando sopas por nome na mosca. Agora é fácil obter uma sopa por nome:
>>> From souper.soup importação get_soup
>>> Sopa = get_soup ('mysoup', o contexto)
>>> Sopa
Fornecendo uma fábrica Catalog
Dependendo de suas necessidades o catálogo e seus índices podem ser diferentes a partir de casos de uso para usar caso. A fábrica de catálogo é responsável por criar um catálogo para uma sopa. A fábrica é um utilitário chamado execução souper.interfaces.ICatalogFactory. O nome da utilidade tem a mesma que a da sopa ter.
Aqui repoze.catalog é usado e para deixar os índices de acessar os dados sobre os registros por tecla NodeAttributeIndexer é usado. Para casos especiais pode-se escrever seus indexadores de costume, mas o padrão é muito bem a maior parte do tempo:
>>> From souper.interfaces importar ICatalogFactory
>>> From souper.soup importação NodeAttributeIndexer
>>> From zope.component provideUtility importação
>>> From Catalog importação repoze.catalog.catalog
>>> From repoze.catalog.indexes.field importação CatalogFieldIndex
>>> From repoze.catalog.indexes.text CatalogTextIndex importação
>>> From repoze.catalog.indexes.keyword CatalogKeywordIndex importação
>>>implementer (ICatalogFactory)
... Class MySoupCatalogFactory (objeto):
...
... Def __call __ (self, context = None):
... Catálogo Catalog = ()
... Userindexer = NodeAttributeIndexer ('user')
... Catálogo [u'user '] = CatalogFieldIndex (userindexer)
... Textindexer = NodeAttributeIndexer ('texto')
... Catálogo [u'text '] = CatalogTextIndex (textindexer)
... keywordindexer = NodeAttributeIndexer ("palavras-chave")
... Catálogo [u'keywords '] = CatalogKeywordIndex (keywordindexer)
... Catálogo retorno
>>> ProvideUtility (MySoupCatalogFactory (), name = "mysoup")
A fábrica de catálogo é usado apenas interno sopa, mas um pode querer verificar se ele funciona bem:
>>> Catalogfactory = getUtility (ICatalogFactory, name = 'mysoup')
>>> Catalogfactory
>>> Catálogo = catalogfactory ()
>>> ordenados (catalog.items ())
[(u'keywords ',
(U'text ',
(U'user ',
Adicionando registros
Como mencionado acima, o souper.soup.Record é o único tipo de dados adicionados à sopa. Um registro tem atributos contendo os dados:
>>> From souper.soup importação get_soup
>>> From souper.soup importação Gravar
>>> Sopa = get_soup ('mysoup', o contexto)
>>> Record = Record ()
>>> record.attrs ['user'] = 'user1'
>>> record.attrs ['text'] = u'foo bar baz '
>>> record.attrs ['palavras-chave'] = [u'1 ', u'2', u '& uuml;']
>>> Record_id = soup.add (record)
Um registro pode conter outros registros. Mas para indexá-los seria necessário um indexador de costume, para que registros usally conatined são valiosos para exibição mais tarde, e não para a pesquisa:
>>> Registro ['subregistro'] = Record ()
>>> recordes attrs ['HomeAddress']. ['zip'] = '6020'
>>> recordes attrs ['HomeAddress']. ['cidade'] = 'Innsbruck'
>>> Recordes attrs ['HomeAddress']. ['País'] = 'Áustria'
Dados de acesso
Mesmo sem qualquer consulta um registro podem ser buscados por id:
>>> From souper.soup importação get_soup
>>> Sopa = get_soup ('mysoup', o contexto)
>>> Record = soup.get (record_id)
Todos os registros podem ser acessados usando utilizando o BTree recipiente:
>>> soup.data.keys () [0] == record_id
Verdadeiro
De dados de consulta
Como consultar um catálogo repoze está documentado bem. Seleção funciona da mesma também. As consultas são passados para sopas método de consulta (que usa então catálogo repoze). Ele retorna um gerador:
>>> From repoze.catalog.query importação Eq
>>> [R para r em soup.query (Eq ('user', 'user1'))]
[
>>> [R para r em soup.query (Eq ('user', 'nonexists'))]
[]
Para também obter o tamanho do conjunto de resultados passar um with_size = True à consulta. O primeiro item devolvido pelo gerador é o tamanho:
>>> [R para r em soup.query (Eq ('user', 'user1'), with_size-True)]
[1,
Para otimizar o manuseio de grandes conjuntos de resultados não se pode buscar o registro, mas um gerador de retornar objetos leves. Os registros são buscados de plantão:
>>> Lazy = [l para l em soup.lazy (Eq ('name', 'name'))]
>>> Preguiçoso
[
>>> Preguiçoso [0] ()
Aqui o tamanho é passada como primeiro valor da geneartor também se with_size = true é passado.
Excluir um registro
Para remover um registro do python sopa del é usado como um faria em qualquer dict:
>>> Del sopa [record_id]
Reindex
Depois de uma dados registros alterados ele precisa de um reindex:
>>> record.attrs ['user'] = 'user1'
>>> Soup.reindex (registros = [registro])
Às vezes um pode querer reindexar todos os dados. Então reindexar tem de ser chamado sem parâmetros. Pode demorar um pouco:
>>> Soup.reindex ()
Reconstruir catálogo
Usally após uma mudança de catálogo fábrica foi feito - ou seja, algum índice foi adicionado - uma reconstrução do catálogo que eu precisava. Ele substitui o catálogo atual por um novo criado pela fábrica de catálogo e reindexa todos os dados. Pode levar tempo:
>>> Soup.rebuild ()
Reset (ou desmarque) a sopa
Para remover todos os dados da sopa e vazio e reconstruir a chamada catálogo clara. Atenção: todos os dados são perdidos!
>>> Soup.clear ()
Notas Instalação
A fim de usar node.ext.zodb souper é necessária. Como este beta foi lançado não houve liberação (será feito em breve). Por favor, verifique pypi se ele está lá, caso contrário, por favor buscar node.ext.zodb de github
O que é novo nesta versão:.
- PEP-8. [Rnix, 2012/10/16]
- Python 2.7 Suporte. [Rnix, 2012/10/16]
- documentação Fix.
Requisitos :
- Python
Comentários não encontrado