2010-05-06 15 views
77

Próbuję przekonwertować z sqlalchemy (sqlite) do używania mongodb. chciałbym zawęzić schemat. Zamierzam spojrzeć na mongokit, ale chcę czegoś podobnego do twórców map, aby zaoszczędzić na własności obiektu, a nie na dyktowaniu.MongoDB ORM dla Pythona?

Chciałbym mappera, abym mógł korzystać z istniejących obiektów bez ich modyfikowania.

+1

Dokładnie, to powinien nazywać się "DRM" (Document-Resource-Mapping) – zsong

+0

To powinno ci pomóc odpowiedzieć na twoje zapytanie http://docs.mongodb.org/ecosystem/drivers/php-libraries/ – Basav

+0

Istnieje biblioteka o nazwie Mongolia, która pozwala ci na interakcję z Mongo obiektów za pomocą atrybutów lub dostępu do słownika i ma możliwość weryfikacji schematu, którą można włączyć : https://github.com/zagaran/mongolia – Zags

Odpowiedz

61

Inną opcją jest MongoEngine. ORM dla MongoEngine jest bardzo podobny do ORM używanego przez Django.

Przykład (z samouczka):

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.Nie można dodawać właściwości w locie do Dokumentu mongoengine'a. Który rodzaj zabawy odbiera od monondb. – tutuca

+7

Możesz użyć DictField, aby dodać dowolne całkowicie bezpodstawne dane, jeśli potrzebujesz. – neuman

+0

Lub GenericEmbeddedDocument? – tunnuz

28

Chcesz MongoKit. Jest to jedna warstwa abstrakcji wyższa niż PyMongo. Nie wiem, czy używasz Django, ale jest też integracja django-mongokit.

Przykład z tego blog post. Zauważ, że instancje komputera mogą odwoływać się do make/model bezpośrednio po zdefiniowaniu struktury (np. Atari.make, c64.model, ...). Nie potrzeba słownikach:

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

jest sposób, aby to zrobić bez modyfikowania istniejących obiektów logiki biznesowej? w sqlalchemy możesz użyć mapperów. – Timmy

+0

więcej zmian chirurgicznych. utrzymuje swój wykres zależności w czystości. ma sens, chociaż nie widzę sposobu, aby to zrobić bezpośrednio. Może coś dziwnego, jak klasa MongoComputer (Computer, Document) lub z jakąś formą mixu? Interesujące ... –

+0

jego czyste w sqlalchemy, a więc pytanie, to jest – Timmy

36

Nie będąc zadowolony z obu MongoKit lub MongoEngine, postanowiłem napisać własny interfejs obiektowego dla Pythona.

Przekazałem wszystkie zapytania bezpośrednio do pymongo, więc składnia zapytania jest taka sama. Przeważnie jest to po prostu obiekt-wrapper wokół wyników, z kilkoma innymi pomocnikami, takimi jak łączenie połączeń z bazami danych, obsługa DBRef i inne metody ułatwiające życie.

Nazywa się Minimongo i jest dostępny z github. Szczęśliwy hacking!

Przykład:

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

To jest bardzo przydatne i proste, po prostu chciałem czegoś, aby nie utknąłem tworząc słowników, nic więcej. – vishalv2050

+1

To jest naprawdę miłe. Szkoda, że ​​nie jest już utrzymywany :( –

13

wiem, że jestem naprawdę późno na to pytanie, ale jestem autorem, a Ming http://merciless.sourceforge.net SQLAlchemy inspirowane walidacji i ORM silnika MongoDB. To jest to, czego używamy w SourceForge, i istnieje uzasadniona prezentacja dostępna pod adresem http://www.slideshare.net/rick446/rapid-and-scalable-development-with-mongodb-pymongo-and-ming, a także studium przypadku migracji z SQLAlchemy do Ming http://www.slideshare.net/__amol__/from-sqlalchemy-to-ming-with-turbogears2. Oto przykład warstwy ORM w Ming (z samouczka):

class WikiPage(MappedClass): 

    class __mongometa__: 
     session = session 
     name = 'wiki_page' 

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

Zapytania używać standardowej składni MongoDB zapytań (nie magiczne argumentów kluczowych Django ORM jest):

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

Ming wydaje nam się drogą, ma zarówno elastyczność, jak i schematy, których potrzebujemy, kiedy potrzebujemy mocy, sprowadzamy się do pymongo – jochem

+0

Jestem nowy w Mongo i Pythonie Czy istnieje samouczek, do którego mogę się odwołać w celu tworzenia modeli takich jak model django i tworzenia skryptów migracji za pomocą Ming. – Varad