micromongo é uma pequena camada em torno pymongo que permite criar classes simples de estilo ORM que podem executar a validação, permitem o acesso de ponto para documentos, resultados queryset auto-wrap, e dar-lhe pré / pós save ganchos.
Ele é projetado com microframeworks em mente, mas é a aplicação e quadro agnóstico. Ele foi criado para simplificar o uso de pymongo e fornecer ferramentas para expressões idiomáticas comuns, para não obscurecer pymongo ou mongodb de suas estruturas de dados.
Você está convidado a abrir questões ou enviar solicitações de tração no github do micromongo
micromongo faz algumas decisões de design em nome da simplificação que pode não funcionar para você:
& Nbsp; - & nbsp; micromongo mantém uma única conexão global, de modo que você não pode ter modelos que se conectam a vários servidores MongoDB
& Nbsp; - & nbsp; há um punhado de nomes de modelos e nomes de atributos de documentos que não funcionam com modelos micromongo; eles serão abordados nos documentos completos
& Nbsp; - & nbsp; você só pode ter um modelo por coleção
Introdução
Para começar com micromongo, basta importá-lo:
>>> From importação micromongo conectar, Modelo
>>> C = connect ()
connect leva os mesmos argumentos como objeto de conexão de pymongo, e comporta-se de forma quase idêntica, exceto que ele tenta retornar automaticamente os resultados da consulta envolvidos nas classes modelo adequado. O objeto de conexão que você crie via esta chamada será armazenada e utilizada pelas várias instalações ORM de estilo, como model.save (), Model.proxy, etc. Se você quiser, um objeto de conexão padrão limpo, você pode obter um facilmente :
>>> From micromongo importação clean_connection
>>> Clean = clean_connection ()
Note-se que clean_connection não ter argumentos e sempre retornará a classe Connection limpo com as mesmas configurações da conexão micromongo atual.
Com esses objetos de conexão, você pode criar bancos de dados ou fazer o que você faria com objetos normais pymongo:
>>> Db = c.test_db
>>> Coleção = db.test_collection
>>> Collection.save ({"docid": 1, "falha": false})
>>> Collection.find_one ()
{U'_id ': ObjectId (' ... '), u'fail': False, u'docid ': 1}
Você também pode declarar o seu próprio modelo para uma coleção particular, em estilo declarativo:
>>> TestModel classe (Modelo):
& Nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; collection = "test_db.test_collection '
>>> Collection.find_one ()
Essas classes têm uma série de recursos adicionais mais de um dicionário que pode torná-los muito mais fácil de usar. As teclas de documentos são acessíveis como atributos:
>>> T = collection.find_one ()
>>> T.fail
Falso
>>> T.docid
1
Os documentos também são facilmente persistiu ao banco de dados:
>>> T.docid = 17
>>> T.save ()
>>> Clean.test_db.test_collection.find_one ()
{U'_id ': ObjectId (' ... '), u'fail': False, u'docid ': 17}
modelos que definem
Acima, o atributo coleção foi designado para o nosso modelo de Foo. Este foi um atalho, embora; se do banco de dados e coleta são atribuídos separadamente, o modelo pode descobrir o nome da coleção completa. Se a coleção e banco de dados não estiverem presentes, micromongo tenta descobrir isso com base na classe e módulo nome do seu modelo. Por exemplo, se tornará blog.Post blog.post, ou se tornará stream.StreamEntry stream.stream_entry. Explícito é melhor que implícito, e é incentivado que você definir a coleção manualmente.
Além de embalar e desembalar os resultados do banco de dados, os modelos também pode definir um documento de especificação que pode definir os padrões e executar a validação antes de salvar o modelo. Tome um modelo post trivial:
>>> From importação micromongo.spec *
>>> Class Post (Modelo):
& Nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; coleta = 'test_db.blog_posts'
& Nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; especificação = dict (
& Nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; author = Campo (obrigatório = True, default = "jmoiron ', type = basestring),
& Nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; title = Field (required = False, default = '', type = basestring),
& Nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; publicado = Campo (obrigatório = True, default = False, type = [verdadeiro, falso]),
& 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 = Field (),
& Nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; )
>>> P = Post.new ()
>>> P
Algumas coisas estão acontecendo aqui. Os campos que têm um padrão são inicializados para que a inadimplência se elas são necessárias ou não. Se um campo obrigatório não tem um padrão, é inicializado para Nenhum.
Campos pode ter um argumento tipo, que pode ser tanto uma função que recebe um valor e retorna verdadeiro ou falso, de um ou mais tipos de base, ou um ou mais valores. Se um ou mais tipos são fornecidos, isinstance é usado para testar se os valores são o tipo certo. Se um ou mais valores são fornecidos, o campo atua como um tipo de enumeração, verificando se os valores estão em seu conjunto de valores. Se nenhum tipo é dado, a validação passa sempre sobre um campo menos que seja necessário e ausente.
Se um campo em p é dado um tipo inválido, então um ValueError é levantada:
>>> P.title = 10
>>> P.save ()
Traceback (most recent call last):
& Nbsp; ...
ValueError: Chaves não encontrou spec: ['title']
>>> Del p.author
>>> P.save ()
Traceback (most recent call last):
& Nbsp; ...
ValueError: campos em falta: ['autor'], campos inválidos: ['title']
>>> P.title = 'Minha primeira blogpost'
>>> P.author = 'jmoiron'
>>> P.published = True
>>> P.body = u "Este é meu primeiro post no blog .. & nbsp; Estou tão animado!"
>>> P.save ()
Model.find
Para maior comodidade e seco, Model.find é um classmethod que usará cursor do micromongo para emitir um achado contra a cobrança direita. Este método se comporta exatamente o mesmo que collection.find de pymongo.
classe de micromongo Cursor ligeiramente modificada também faz um método order_by de inspiração django disponível para todos os cursores (encontrar e qualquer coisa que você encadear fora se ele retorna um cursor). Você pode passar um ou mais nomes de campo, com um líder opcional '-', para resolver as coisas por ordem crescente ou decrescente.
Estas mudanças permitem que você use a maioria do poder de pymongo sem ter que importá-lo, e permite-lhe evitar a repetição desnecessária de a localização de seus dados.
campo de subclasses
Você é encorajado a criar seus próprios campos que fazem o que você quer. Subclasses de campo tem um pre_validate função de gancho que tomar um valor de entrada e pode transformá-lo da forma que quiserem. Note que isto só irá funcionar se os campos estão realmente presentes; de modo a obter algo como um auto_now_add em um DateTimeField, você vai querer fazê-la necessária e tem o seu pre_validate transformar None em datetime.datetime.now ()
Requisitos :.
- Python
Comentários não encontrado