MongoDB ORM dla Pythona? [Zamknięte]

85

Próbuję migrować z sqlalchemy (SQlite) do korzystania z mongodb. Chciałbym wertifikować schemat. Patrzę na mongokit, ale chcę czegoś, co jest podobne do mapperów, aby oszczędzało z własności obiektu, a nie dyktu.

Chciałbym mappera, aby móc używać istniejących obiektów bez ich modyfikowania.

Timmy
źródło
1
Dokładniej, powinno się nazywać „DRM” (mapowanie zasobów dokumentu)
zs2020
To powinno pomóc Ci odpowiedzieć na Twoje zapytanie docs.mongodb.org/ecosystem/drivers/php-libraries
Basav
Istnieje biblioteka nazywa Mongolia, które pozwalają na interakcję z obiektami Mongo za pomocą atrybutów lub słowniku dostępu i weryfikacji ma schematu, który można włączyć: github.com/zagaran/mongolia
Zags
@zsong Relational and Document ... Nie powinno nazywać się Object Relational and Object Document?
Jaime Sangcap
to może być pomocne: pythonhosted.org/Flask-MongoAlchemy
Xiao

Odpowiedzi:

69

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()
David Narayan
źródło
16
AFAIK. Nie możesz dodawać właściwości w locie do dokumentu mongoengine. Co odbiera mongodbowi trochę zabawy.
tutuca,
9
W razie potrzeby możesz użyć DictField, aby dodać dowolne dane całkowicie pozbawione schematu.
neuman
Lub GenericEmbeddedDocument?
tunnuz
Mongoengine ma poważne problemy z wydajnością. Jeśli chcesz go użyć w środowisku produkcyjnym, zadziała tylko wtedy, gdy masz bardzo prosty, lekki schemat.
Valerie R. Coffman
3
Dla tych, którzy szukają bardziej kompleksowego przeglądu ORM MongoDB dostępnych dla Pythona, strona PyMongo „Narzędzia” zawiera całkiem sporo z nich i jest regularnie aktualizowana
Ascendant
40

Nie będąc zadowolony ani z MongoKit, ani z MongoEngine, zdecydowałem się napisać własny interfejs zorientowany obiektowo dla Pythona.

Wszystkie zapytania przekazałem bezpośrednio do pymongo, więc składnia zapytań jest taka sama. Przeważnie jest to tylko otoka obiektów wokół wyników, z kilkoma innymi pomocnikami, takimi jak pule połączeń bazy danych, obsługa DBRef i inne wygodne metody ułatwiające życie.

Nazywa się Minimongo i jest dostępny na github. Miłego hakowania!

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
slacy
źródło
1
Jest to bardzo przydatne i proste, po prostu chciałem czegoś, żeby nie utknąć w tworzeniu słowników, nic więcej.
vishalv2050
1
To jest naprawdę miłe. Szkoda, że ​​nie jest już utrzymywany :(
jeśli __name__ to Brak
30

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

Przykład z tego wpisu na blogu . Zwróć uwagę, że instancje Computer mogą następnie odwoływać się do marki / modelu bezpośrednio po zdefiniowaniu struktury (np. Atari.make, c64.model, ...). Nie ma potrzeby używania słowników:

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']}, 
    ]
Ryan Cox
źródło
czy istnieje sposób na zrobienie tego bez modyfikowania istniejących obiektów logiki biznesowej? w sqlalchemy możesz używać mapperów.
Timmy
bardziej chirurgiczna zmiana. utrzymuje czysty wykres zależności. ma sens, chociaż nie widzę sposobu, aby to zrobić bezpośrednio. Może coś dziwnego jak klasa MongoComputer (komputer, dokument) lub z jakąś formą mieszania? Ciekawe ...
Ryan Cox
jest czysty w sqlalchemy, stąd pytanie, niż
Timmy
Brak zmian kodu w mongokit od 2015 i brak wydania od 2014. Cholera, nie rozumiem tego świata Pythona :(.
JAR.JAR.beans
15

Wiem, że jestem naprawdę spóźniony z tym pytaniem, ale jestem autorem Ming http://merciless.sourceforge.net , opartego na SQLAlchemy walidacji MongoDB i silnika ORM. To jest to, czego używamy w SourceForge, a rozsądna prezentacja jest dostępna pod adresem http://www.slideshare.net/rick446/rapid-and-scalable-development-with-mongodb-pymongo-and-ming, a także studium przypadku dotyczące migracja 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żywają standardowej składni zapytań MongoDB (nie magicznych argumentów słów kluczowych Django ORM):

WikiComment.query.find(dict(page_id=wp._id))
Rick Copeland
źródło
Wydaje nam się, że Ming jest właściwą drogą. Ma zarówno elastyczność, jak i koncepcje schematu, których potrzebujemy. Kiedy potrzebujemy mocy, schodzimy do pymongo.
jochem
1
Jestem nowy w mongo i pythonie. Czy istnieje samouczek, do którego mogę się odwołać przy tworzeniu modeli, takich jak model.py w django i tworzeniu skryptów migracji przy użyciu Ming.
Varad