2010-05-06 16 views
77

Estoy tratando de convertir de sqlalchemy (sqlite) a usar mongodb. Me gustaría la vertificación del esquema. Estoy mirando a mongokit, pero quiero algo similar a los mapeadores, para que se guarde de la propiedad del objeto, y no un dict.MongoDB ORM para Python?

me gustaría un asignador para poder usar objetos existentes sin modificarlos.

+1

Precisamente, lo que debería se llamará "DRM" (Asignación de documentos y recursos) – zsong

+0

Esto debería ayudarlo a responder su consulta http://docs.mongodb.org/ecosystem/drivers/php-libraries/ – Basav

+0

Hay una biblioteca llamada Mongolia que le permite interactuar con mongo objetos a través de atributos o acceso al diccionario y tiene una verificación de esquema que puede habilitar : https://github.com/zagaran/mongolia – Zags

Respuesta

61

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

Ejemplo (desde el 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() 
+14

AFAIK.No puede agregar propiedades sobre la marcha al documento de mongoengine. Qué tipo de diversión se lleva un poco de mongodb. – tutuca

+7

Puede usar DictField para agregar cualquier tipo de datos totalmente sin esquema si lo necesita. – neuman

+0

¿O el GenericEmbeddedDocument? – tunnuz

28

Quiere MongoKit. Es una capa de abstracción superior a PyMongo. No estoy seguro si está usando Django, pero también hay integración con django-mongokit.

Ejemplo de este blog post. Tenga en cuenta que las instancias de la computadora pueden hacer referencia a la marca/modelo directamente una vez que la estructura está definida (por ejemplo, atari.make, c64.model, ...). No hay 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']}, 
    ] 
+0

¿hay alguna manera de hacerlo sin modificar los objetos lógicos de negocios existentes? en sqlalchemy, puedes usar mappers. – Timmy

+0

más cambio quirúrgico. mantiene limpio su gráfico de dependencia. tiene sentido, aunque no veo una manera de hacer esto directamente. Tal vez algo extraño como la clase MongoComputer (computadora, documento) o con alguna forma de mezcla? Interesante ... –

+0

es limpio en sqlalchemy, por lo tanto, la pregunta es – Timmy

36

Al no quedar satisfecha, ya sea con o MongoKit 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. Principalmente, es solo un envoltorio de objetos alrededor de los resultados, con algunos otros ayudantes como la agrupación de conexiones de bases de datos, el soporte de DBRef y otros métodos de conveniencia para facilitarle la vida. Se ha llamado Minimongo y está disponible en github. ¡Feliz hacking!

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 
+0

Esto es súper útil y simple, solo quería algo para que yo no estoy atascado creando diccionarios, nada más. – vishalv2050

+1

Esto es realmente bueno. Lástima que ya no se mantenga :( –

13

Sé que soy muy tarde a esta pregunta, pero yo soy el autor de Ming http://merciless.sourceforge.net, una validación y ORM motor MongoDB inspiración 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 la migración de SQLAlchemy a Ming http://www.slideshare.net/__amol__/from-sqlalchemy-to-ming-with-turbogears2. He aquí 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') 

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

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

Ming nos parece el camino a seguir. Tiene la flexibilidad y los conceptos de esquema que necesitamos. Cuando necesitamos potencia, nos bajamos a Pymongo. – jochem

+0

Soy nuevo en mongo y python ¿Hay un tutorial al que pueda hacer referencia para crear Modelos como model.py de django y crear scripts de migración usando Ming? – Varad

Cuestiones relacionadas