MongoDB ORM para Python? [cerrado]

85

Estoy intentando migrar de sqlalchemy (SQlite) a usar mongodb. Me gustaría la verticalización del esquema. Estoy mirando mongokit, pero quiero algo que sea similar a los mapeadores, para que se salve de la propiedad del objeto y no de un dict.

Me gustaría un mapeador para poder usar objetos existentes sin modificarlos.

Timmy
fuente
1
Precisamente, debería llamarse "DRM" (Document-Resource-Mapping)
zs2020
Esto debería ayudarlo a responder su consulta docs.mongodb.org/ecosystem/drivers/php-libraries
Basav
Hay una biblioteca llamada mongolia que le permite interactuar con objetos mongo a través de atributos o acceso al diccionario y tiene una verificación de esquema que puede habilitar: github.com/zagaran/mongolia
Zags
@zsong Relational and Document ... ¿No debería llamarse Object Relational y Object Document?
Jaime Sangcap
esto puede ser útil: pythonhosted.org/Flask-MongoAlchemy
Xiao

Respuestas:

69

Otra opción es MongoEngine . El ORM para MongoEngine es muy similar al ORM utilizado por Django.

Ejemplo (del 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()
David Narayan
fuente
16
HASTA DONDE SE. No puede agregar propiedades sobre la marcha al documento de mongoengine. Lo que le quita algo de diversión a mongodb.
tutuca
9
Puede usar DictField para agregar cualquier tipo de datos totalmente sin esquema si lo necesita.
neuman
¿O el GenericEmbeddedDocument?
tunnuz
Mongoengine tiene serios problemas de rendimiento. Si desea utilizarlo en producción, solo funcionará si tiene un esquema muy simple y ligero.
Valerie R. Coffman
3
Para aquellos que buscan una descripción general más completa de los ORM de MongoDB disponibles para Python, la página de "Herramientas" de PyMongo enumera algunas de ellas, y se mantiene regularmente: api.mongodb.com/python/current/tools.html
Ascendant
40

No estando satisfecho con MongoKit o MongoEngine, decidí escribir mi propia interfaz orientada a objetos para Python.

Delegué todas las consultas directamente a pymongo, por lo que la sintaxis de la consulta es la misma. En su mayoría, es solo un envoltorio de objetos alrededor de los resultados, con algunos otros ayudantes como la agrupación de conexiones de base de datos, soporte DBRef y otros métodos convenientes para hacer su vida más fácil.

Se llama Minimongo y está disponible en github. ¡Feliz piratería!

Ejemplo:

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
Slacy
fuente
1
Esto es súper útil y simple, solo quería algo para no quedarme atrapado creando diccionarios, nada más.
vishalv2050
1
Esto es realmente bueno. Lástima que ya no se mantenga :(
si __name__ es None
30

Quieres MongoKit . Es una capa de abstracción más alta que PyMongo . No estoy seguro si está usando Django, pero también hay integración django-mongokit .

Ejemplo de esta publicación de blog . Tenga en cuenta que las instancias de Computer pueden hacer referencia a la marca / modelo directamente una vez definida la estructura (por ejemplo, atari.make, c64.model, ...). Sin necesidad de diccionarios:

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']}, 
    ]
Ryan Cox
fuente
¿Hay alguna forma de hacer esto sin modificar los objetos de lógica empresarial existentes? en sqlalchemy, puede utilizar mapeadores.
Timmy
más cambio quirúrgico. mantiene limpio su gráfico de dependencia. tiene sentido, aunque no veo una forma de hacerlo directamente. ¿Quizás algo extraño como clase MongoComputer (Computadora, Documento) o con alguna forma de mezcla? Interesante ...
Ryan Cox
está limpio en sqlalchemy, de ahí la pregunta, thans
Timmy
No hay cambios de código en mongokit desde 2015 y no hay lanzamiento desde 2014. Maldita sea, no entiendo este mundo de Python :(.
JAR.JAR.beans
15

Sé que llegué tarde a esta pregunta, pero soy el autor de Ming http://merciless.sourceforge.net , un motor de validación y ORM MongoDB inspirado en SQLAlchemy. Es lo que usamos en SourceForge, y hay una presentación razonable disponible en http://www.slideshare.net/rick446/rapid-and-scalable-development-with-mongodb-pymongo-and-ming , así como un estudio de caso sobre migrando de SQLAlchemy a Ming http://www.slideshare.net/__amol__/from-sqlalchemy-to-ming-with-turbogears2 . Aquí hay un ejemplo de la capa ORM en Ming (del tutorial):

class WikiPage(MappedClass):

    class __mongometa__:
        session = session
        name = 'wiki_page'

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

Las consultas utilizan la sintaxis de consulta estándar de MongoDB (no los argumentos de palabras clave mágicas de Django ORM):

WikiComment.query.find(dict(page_id=wp._id))
Rick Copeland
fuente
Ming nos parece el camino a seguir. Tiene la flexibilidad y los conceptos esquemáticos que necesitamos. Cuando necesitamos energía, bajamos a pymongo.
jochem
1
Soy nuevo en mongo y python. ¿Hay algún tutorial al que pueda consultar para crear modelos como django's model.py y crear scripts de migración usando Ming?
Varad