MongoDB ORM für Python? [geschlossen]


84

Ich versuche, von SQLalchemy (SQlite) auf Mongodb umzusteigen. Ich möchte eine Schema-Vertifizierung. Ich schaue auf Mongokit, aber ich möchte etwas, das Mappern ähnlich ist, damit es aus dem Eigentum des Objekts gerettet wird und kein Diktat.

Ich möchte einen Mapper, damit ich vorhandene Objekte verwenden kann, ohne sie zu ändern.


1
Genau genommen sollte es "DRM" (Document-Resource-Mapping)
heißen

Dies sollte Ihnen helfen, Ihre Anfrage zu beantworten docs.mongodb.org/ecosystem/drivers/php-libraries
Basav

Es gibt eine Bibliothek namens Mongolei, mit der Sie über Attribute oder Wörterbuchzugriff mit Mongo-Objekten interagieren können. Sie verfügt über eine Schemaüberprüfung
Zags

@zsong Relational und Dokument ... Sollte nicht als Objekt relational und Objektdokument bezeichnet werden?
Jaime Sangcap

Dies kann hilfreich sein: pythonhosted.org/Flask-MongoAlchemy
Xiao

Antworten:


68

Eine weitere Option ist MongoEngine . Das ORM für MongoEngine ist dem von Django verwendeten ORM sehr ähnlich.

Beispiel (aus dem 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
SO VIEL ICH WEISS. Sie können dem Dokument von mongoengine keine Eigenschaften im laufenden Betrieb hinzufügen. Welche Art von macht ein bisschen Spaß von Mongodb.
Tutuca

9
Sie können das DictField verwenden, um bei Bedarf jede Art von vollständig schemenlosen Daten hinzuzufügen.
Neuman

Oder das GenericEmbeddedDocument?
Tunnuz

Mongoengine hat einige schwerwiegende Leistungsprobleme. Wenn Sie es in der Produktion verwenden möchten, funktioniert es nur, wenn Sie ein sehr einfaches, leichtes Schema haben.
Valerie R. Coffman

3
Für diejenigen, die einen umfassenderen Überblick über MongoDB-ORMs suchen, die für Python verfügbar sind, werden auf der PyMongo-Seite "Tools" einige davon aufgelistet
Ascendant

40

Da ich weder mit MongoKit noch mit MongoEngine zufrieden war, beschloss ich, meine eigene objektorientierte Oberfläche für Python zu schreiben.

Ich habe alle Abfragen direkt an pymongo delegiert, daher ist die Abfragesyntax dort dieselbe. Meistens handelt es sich nur um einen Objekt-Wrapper um die Ergebnisse, mit einigen anderen Hilfsprogrammen wie Datenbankverbindungspooling, DBRef-Unterstützung und anderen praktischen Methoden, die Ihnen das Leben erleichtern.

Es heißt Minimongo und ist bei Github erhältlich. Viel Spaß beim Hacken!

Beispiel:

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
Das ist super nützlich und einfach, ich wollte nur etwas, damit ich nicht daran gehindert bin, Wörterbücher zu erstellen, sonst nichts.
vishalv2050

1
Das ist wirklich schön. Schade, dass es nicht mehr gepflegt wird :(
wenn __name__ None ist

29

Du willst MongoKit . Es ist eine Abstraktionsebene höher als PyMongo . Ich bin mir nicht sicher, ob Sie Django verwenden, aber es gibt auch eine Django-Mongokit- Integration.

Beispiel aus diesem Blogbeitrag . Beachten Sie, dass Instanzen von Computer dann direkt auf make / model verweisen können, sobald die Struktur definiert ist (z. B. atari.make, c64.model, ...). Keine Notwendigkeit für Wörterbücher:

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

Gibt es eine Möglichkeit, dies zu tun, ohne vorhandene Geschäftslogikobjekte zu ändern? In der SQLalchemie können Sie Mapper verwenden.
Timmy

mehr chirurgische Veränderung. hält Ihr Abhängigkeitsdiagramm sauber. macht Sinn, obwohl ich keinen Weg sehe, dies direkt zu tun. Vielleicht etwas Seltsames wie Klasse MongoComputer (Computer, Dokument) oder mit irgendeiner Form von Mix-In? Interessant ...
Ryan Cox

Es ist sauber in der Chemie, daher die Frage als
Timmy

Keine Codeänderungen in Mongokit seit 2015 und keine Veröffentlichung seit 2014. Verdammt, ich verstehe diese Python-Welt nicht :(.
JAR.JAR.beans

15

Ich weiß, dass ich mit dieser Frage sehr spät komme, aber ich bin der Autor von Ming http://merciless.sourceforge.net , einer von SQLAlchemy inspirierten MongoDB-Validierungs- und ORM-Engine. Es ist das, was wir bei SourceForge verwenden, und es gibt eine vernünftige Präsentation unter http://www.slideshare.net/rick446/rapid-and-scalable-development-with-mongodb-pymongo-and-ming sowie eine Fallstudie zu Migration von SQLAlchemy nach Ming http://www.slideshare.net/__amol__/from-sqlalchemy-to-ming-with-turbogears2 . Hier ist ein Beispiel für die ORM-Ebene in Ming (aus dem Tutorial):

class WikiPage(MappedClass):

    class __mongometa__:
        session = session
        name = 'wiki_page'

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

Abfragen verwenden die Standard-MongoDB-Abfragesyntax (nicht die magischen Schlüsselwortargumente von Django ORM):

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

Ming scheint für uns der richtige Weg zu sein. Es hat sowohl die Flexibilität als auch die schematischen Konzepte, die wir brauchen. Wenn wir Strom brauchen, fallen wir nach Pymongo.
jochem

1
Ich bin neu in Mongo und Python. Gibt es ein Tutorial, auf das ich verweisen kann, um Modelle wie djangos model.py zu erstellen und Migrationsskripte mit Ming zu erstellen?
Varad
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.