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 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.