2010-05-06 8 views
77

ich versuche, von sqlalchemy (sqlite) zu mongodb zu konvertieren. Ich möchte Schemaverifikation. Ich schaue auf mongokit, aber ich möchte etwas mit Mappern ähnlich, so dass es von der Eigenschaft des Objekts, und kein Diktat speichern würde.MongoDB ORM für Python?

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

+1

Genau, es sollte genannt "DRM" (Document-Resource-Mapping) – zsong

+0

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

+0

Es gibt eine Bibliothek namens Mongolia, die Sie mit Mongo interagieren können Objekte über Attribute oder Wörterbuchzugriff und verfügt über eine Schemaüberprüfung, die Sie aktivieren können : https://github.com/zagaran/mongolia – Zags

Antwort

61

Eine andere 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() 
+14

AFAIK.Sie können dem Mongoengine-Dokument keine Eigenschaften hinzufügen. Welche Art von Mongodb braucht etwas Spaß? – tutuca

+7

Sie können das DictField verwenden, um bei Bedarf beliebige schemalose Daten hinzuzufügen. – neuman

+0

Oder das GenericEmbeddedDocument? – tunnuz

28

Sie möchten MongoKit. Es ist eine Abstraktionsebene höher als PyMongo. Nicht sicher, ob Sie Django verwenden, aber es gibt auch django-mongokit Integration.

Beispiel von diesem blog post. 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']}, 
    ] 
+0

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

+0

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

+0

ist es sauber in sqlalchemy, also die Frage, thans – Timmy

36

Nicht mit entweder MongoKit oder MongoEngine zufrieden zu sein, habe ich beschlossen, meine eigene objektorientierte Schnittstelle für Python zu schreiben.

Ich habe alle Abfragen direkt an Pymongo delegiert, so dass die Syntax der Abfrage dort gleich ist. Meistens ist es nur ein Objekt-Wrapper um die Ergebnisse, mit einigen anderen Helfern wie Datenbankverbindungs-Pooling, DBRef-Unterstützung und anderen Komfort-Methoden, um Ihnen das Leben zu erleichtern.

Es heißt Minimongo und es ist von Github verfügbar. Fröhliches 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 
+0

Dies ist sehr nützlich und einfach, ich wollte nur etwas, damit ich Ich bin nicht dabei, Wörterbücher zu erstellen, sonst nichts. – vishalv2050

+1

Das ist wirklich nett. Schade, dass es nicht mehr gepflegt wird :( –

13

Ich weiß, ich bin wirklich spät auf diese Frage, aber ich bin der Autor von Ming http://merciless.sourceforge.net, eine SQLAlchemy-inspirierten MongoDB Validierung und ORM-Engine. Es ist, 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 über die Migration von SQLAlchemy zu Ming http://www.slideshare.net/__amol__/from-sqlalchemy-to-ming-with-turbogears2. Hier ist ein Beispiel für die ORM-Schicht 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, um die Standard-MongoDB Abfragesyntax (nicht Django ORM Magie Schlüsselwort Argumente):

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

Ming scheint für uns der Weg zu gehen. Es hat sowohl die Flexibilität als auch die schema-ischen Konzepte, die wir brauchen. Wenn wir Energie brauchen, gehen wir runter zu pymongo. – jochem

+0

Ich bin neu bei Mongo und Python Gibt es ein Tutorial, auf das ich zurückgreifen kann, um Modelle wie djangos model.py zu erstellen und Migrationsskripte mit Ming zu erstellen? – Varad