MongoDB ORM para Python? [fechadas]


85

Estou tentando migrar do sqlalchemy (SQlite) para o mongodb. Eu gostaria de verificação do esquema. Estou olhando para o mongokit, mas quero algo que seja semelhante aos mapeadores, de modo que seja salvo da propriedade do objeto, e não de um dict.

Eu gostaria de um mapeador para que eu possa usar objetos existentes sem modificá-los.


1
Precisamente, deve ser chamado de "DRM" (Document-Resource-Mapping)
— zs2020

Isso deve ajudá-lo a responder à sua consulta docs.mongodb.org/ecosystem/drivers/php-libraries
— Basav

Há uma biblioteca chamada mongolia que permite que você interaja com objetos mongo por meio de atributos ou acesso de dicionário e tem verificação de esquema que você pode ativar: github.com/zagaran/mongolia
— Zags

@zsong Relacional e Documento ... Não deve ser chamado de Relacional de Objeto e Documento de Objeto?
— Jaime Sangcap

Respostas:


69

Outra opção é o MongoEngine . O ORM para MongoEngine é muito semelhante ao ORM usado pelo Django.

Exemplo (do tutorial):

class Post(Document):
    title = StringField(max_length=120, required=True)
    author = ReferenceField(User)

class TextPost(Post):
    content = StringField()

class ImagePost(Post):
    image_path = StringField()

class LinkPost(Post):
    link_url = StringField()

16
ATÉ ONDE SEI. Você não pode adicionar propriedades instantaneamente ao documento do mongoengine. O que tira um pouco da diversão do mongodb.
— tutuca,

10
Você pode usar o DictField para adicionar qualquer tipo de dados totalmente sem esquema, se necessário.
— neuman

Ou o GenericEmbeddedDocument?
— tunnuz de

Mongoengine tem alguns problemas sérios de desempenho. Se você quiser usá-lo na produção, ele só funcionará se você tiver um esquema muito simples e leve.
— Valerie R. Coffman

3
Para aqueles que procuram uma visão geral mais abrangente dos ORMs do MongoDB disponíveis para Python, a página "Ferramentas" do PyMongo lista alguns deles e é mantida regularmente: api.mongodb.com/python/current/tools.html
— Ascendant

40

Não estando satisfeito com o MongoKit ou MongoEngine, decidi escrever minha própria interface orientada a objetos para Python.

Deleguei todas as consultas diretamente para pymongo, de modo que a sintaxe da consulta lá é a mesma. Principalmente, é apenas um envoltório de objeto em torno dos resultados, com alguns outros auxiliares como pool de conexão de banco de dados, suporte DBRef e outros métodos de conveniência para tornar sua vida mais fácil.

Chama-se Minimongo e está disponível no github. Feliz hackeamento!

Exemplo:

from minimongo import Model, MongoCollection 

class MyObject(Model): 
    model = MongoCollection(database='test', collection='my_collection')

m = MyObject()
m.x = 1
m.field = 'value'
m.other = {'list': True}
m.save()

x = MyObject({'x': 1, 'y': 2}).save()

objs = MyObject.find({'x': 1})
for o in objs: 
    print o

1
Isso é super útil e simples, eu só queria algo para não ficar preso a criar dicionários, nada mais.
— vishalv2050

1
Isso é muito bom. Pena que não é mais mantido :(
— se __name__ for Nenhum

30

Você quer o MongoKit . É uma camada de abstração superior a PyMongo . Não tenho certeza se você está usando Django, mas também há integração django-mongokit .

Exemplo desta postagem do blog . Observe que as instâncias de Computer podem então fazer referência a marca / modelo diretamente, uma vez que a estrutura seja definida (por exemplo, atari.make, c64.model, ...). Não há necessidade de dicionários:

import datetime 
from mongokit import Document

class Computer(Document):

    structure = { 
      'make': unicode, 
      'model': unicode, 
      'purchase_date': datetime.datetime, 
      'cpu_ghz': float, 
    }

    validators = { 
      'cpu_ghz': lambda x: x > 0, 
      'make': lambda x: x.strip(), 
    }

    default_values = { 
      'purchase_date': datetime.datetime.utcnow, 
    }

    use_dot_notation = True

    indexes = [ 
      {'fields': ['make']}, 
    ]

existe uma maneira de fazer isso sem modificar os objetos de lógica de negócios existentes? no sqlalchemy, você pode usar mapeadores.
— Timmy

mais mudança cirúrgica. mantém seu gráfico de dependência limpo. faz sentido, embora eu não veja uma maneira de fazer isso diretamente. Talvez algo estranho como a classe MongoComputer (Computer, Document) ou com alguma forma de mix in? Interessante ...
— Ryan Cox

está limpo em sqlalchemy, portanto, a questão, obrigado
— Timmy

Sem alterações de código no mongokit desde 2015 e sem lançamento desde 2014. droga, eu não entendo esse mundo python :(.
— JAR.JAR.beans

15

Eu sei que estou muito atrasado para esta pergunta, mas sou o autor de Ming http://merciless.sourceforge.net , um mecanismo de validação e ORM inspirado em SQLAlchemy MongoDB. É o que usamos no SourceForge, e há uma apresentação razoável disponível em http://www.slideshare.net/rick446/rapid-and-scalable-development-with-mongodb-pymongo-and-ming , bem como um estudo de caso sobre migrando de SQLAlchemy para Ming http://www.slideshare.net/__amol__/from-sqlalchemy-to-ming-with-turbogears2 . Aqui está um exemplo da camada ORM no Ming (do tutorial):

class WikiPage(MappedClass):

    class __mongometa__:
        session = session
        name = 'wiki_page'

    _id = FieldProperty(schema.ObjectId)
    title = FieldProperty(str)
    text = FieldProperty(str)
    comments=RelationProperty('WikiComment')

As consultas usam a sintaxe de consulta padrão do MongoDB (não os argumentos de palavra-chave mágica do Django ORM):

WikiComment.query.find(dict(page_id=wp._id))

Ming parece para nós o caminho a seguir. Ele tem a flexibilidade e os conceitos de esquema de que precisamos. Quando precisamos de energia, caímos em pymongo.
— jochem de

1
Eu sou novo em mongo e python. Existe um tutorial onde posso consultar para criar modelos como o model.py do django e criar scripts de migração usando Ming.
— Varad
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.