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.


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()

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

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

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))

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.