MongoDB ORM per Python? [chiuso]


85

Sto cercando di migrare da sqlalchemy (SQlite) all'utilizzo di mongodb. Vorrei la verifica dello schema. Sto guardando mongokit, ma voglio qualcosa che sia simile ai mappatori, in modo che salvi dalla proprietà dell'oggetto, e non un dict.

vorrei un mappatore in modo da poter utilizzare oggetti esistenti senza modificarli.


1
Precisamente, dovrebbe chiamarsi "DRM" (Document-Resource-Mapping)
zs2020

Questo dovrebbe aiutarti a rispondere alla tua domanda docs.mongodb.org/ecosystem/drivers/php-libraries
Basav

C'è una libreria chiamata mongolia che ti consente di interagire con oggetti mongo tramite attributi o accesso al dizionario e ha la verifica dello schema che puoi abilitare: github.com/zagaran/mongolia
Zags

@zsong Relational and Document ... Non dovrebbe essere chiamato Object Relational and Object Document?
Jaime Sangcap

questo può essere utile: pythonhosted.org/Flask-MongoAlchemy
Xiao

Risposte:


69

Un'altra opzione è MongoEngine . L'ORM per MongoEngine è molto simile all'ORM utilizzato da Django.

Esempio (dal 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
PER QUANTO NE SO. Non è possibile aggiungere proprietà al volo al documento di mongoengine. Il che toglie un po 'di divertimento a Mongodb.
tutuca

10
È possibile utilizzare DictField per aggiungere qualsiasi tipo di dati totalmente privi di schema, se necessario.
neuman

O il GenericEmbeddedDocument?
tunnuz

Mongoengine ha alcuni seri problemi di prestazioni. Se vuoi usarlo in produzione, funzionerà solo se hai uno schema molto semplice e leggero.
Valerie R. Coffman

3
Per coloro che cercano una panoramica più completa degli ORM MongoDB disponibili per Python, la pagina "Strumenti" di PyMongo ne elenca alcuni ed è regolarmente mantenuta: api.mongodb.com/python/current/tools.html
Ascendant

40

Non essendo soddisfatto né di MongoKit né di MongoEngine, ho deciso di scrivere la mia interfaccia orientata agli oggetti per Python.

Ho delegato tutte le query direttamente a pymongo, quindi la sintassi della query è la stessa. Per lo più, è solo un oggetto wrapper attorno ai risultati, con alcuni altri helper come il pool di connessioni al database, il supporto DBRef e altri metodi convenienti per semplificarti la vita.

Si chiama Minimongo ed è disponibile su GitHub. Buon hacking!

Esempio:

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
Questo è super utile e semplice, volevo solo qualcosa in modo da non rimanere bloccato a creare dizionari, nient'altro.
vishalv2050

1
Questo è davvero carino. Peccato che non sia più mantenuto :(
se __name__ è Nessuno il

30

Vuoi MongoKit . È uno strato di astrazione superiore a PyMongo . Non sono sicuro se stai usando Django, ma c'è anche django-mongokit integrazione .

Esempio da questo post del blog . Si noti che le istanze di Computer possono quindi fare riferimento a make / model direttamente una volta definita la struttura (ad esempio atari.make, c64.model, ...). Non servono dizionari:

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']}, 
    ]

c'è un modo per farlo senza modificare gli oggetti della logica di business esistenti? in sqlalchemy, puoi usare i mappatori.
Timmy

cambiamento più chirurgico. mantiene pulito il grafico delle dipendenze. ha senso, anche se non vedo un modo per farlo direttamente. Forse qualcosa di strano come la classe MongoComputer (Computer, Documento) o con qualche forma di mix? Interessante ...
Ryan Cox

è pulito in sqlalchemy, quindi la domanda, grazie
Timmy

Nessuna modifica al codice in Mongokit dal 2015 e nessuna versione dal 2014. Accidenti, non capisco questo mondo Python :(.
JAR.JAR.beans

15

So di essere davvero in ritardo su questa domanda, ma sono l'autore di Ming http://merciless.sourceforge.net , una convalida MongoDB ispirata a SQLAlchemy e un motore ORM. È quello che usiamo a SourceForge, e c'è una presentazione ragionevole disponibile su http://www.slideshare.net/rick446/rapid-and-scalable-development-with-mongodb-pymongo-and-ming , nonché un caso di studio su migrazione da SQLAlchemy a Ming http://www.slideshare.net/__amol__/from-sqlalchemy-to-ming-with-turbogears2 . Ecco un esempio del livello ORM in Ming (dal tutorial):

class WikiPage(MappedClass):

    class __mongometa__:
        session = session
        name = 'wiki_page'

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

Le query utilizzano la sintassi delle query MongoDB standard (non gli argomenti delle parole chiave magiche di Django ORM):

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

Ming sembra per noi la strada da percorrere. Ha sia la flessibilità che i concetti di schema di cui abbiamo bisogno. Quando abbiamo bisogno di energia, scendiamo a pymongo.
jochem

1
Sono nuovo di mongo e python. C'è un tutorial a cui posso fare riferimento per creare modelli come model.py di django e creare script di migrazione usando Ming.
Varad,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.