Python için MongoDB ORM? [kapalı]


85

Sqlalchemy'den (SQlite) mongodb kullanmaya geçmeye çalışıyorum. Şema dikeyleştirmesini istiyorum. Mongokit'e bakıyorum, ancak haritacılara benzer bir şey istiyorum, böylece nesnenin özelliğinden tasarruf edecek, bir emir değil.

Mevcut nesneleri değiştirmeden kullanabilmem için bir eşleyici istiyorum.


1
Tam olarak "DRM" (Belge-Kaynak-Eşleme) olarak adlandırılmalıdır
zs2020

Bu, sorgunuzu yanıtlamanıza yardımcı olacaktır docs.mongodb.org/ecosystem/drivers/php-libraries
Basav

Orada moğolistan adında bir kütüphane let nitelikler veya sözlük erişim yoluyla Mongo nesnelerle etkileşim sensin işte ve etkinleştirmek ki şema doğrulama vardır: github.com/zagaran/mongolia
zags

@zsong İlişkisel ve Belge ... Nesne İlişkisel ve Nesne Belgesi olarak adlandırılmamalı mı?
Jaime Sangcap

bu yardımcı olabilir: pythonhosted.org/Flask-MongoAlchemy
Xiao

Yanıtlar:


69

Diğer bir seçenek ise MongoEngine'dir . MongoEngine için ORM, Django tarafından kullanılan ORM'ye çok benzer.

Örnek (eğiticiden):

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
BİLDİĞİM KADARIYLA. Mongoengine's Document'a anında özellik ekleyemezsiniz. Hangisi mongodb'dan biraz eğlence alır.
tutuca

10
Gerekirse, tamamen şemasız her türlü veriyi eklemek için DictField'ı kullanabilirsiniz.
neuman

Veya GenericEmbeddedDocument?
tunnuz

Mongoengine'in bazı ciddi performans sorunları var. Üretimde kullanmak istiyorsanız, yalnızca çok basit, hafif bir şemanız varsa işe yarayacaktır.
Valerie R. Coffman

3
Python için kullanılabilen MongoDB ORM'lerine daha kapsamlı bir genel bakış arayanlar için, PyMongo "Araçlar" sayfası bunlardan birçoğunu listeler ve düzenli olarak korunur: api.mongodb.com/python/current/tools.html
Ascendant

40

MongoKit veya MongoEngine'den memnun olmadığım için Python için kendi nesne yönelimli arayüzümü yazmaya karar verdim.

Tüm sorguları doğrudan pymongo'ya devrettim, bu nedenle sorgu sözdizimi aynı. Çoğunlukla, veritabanı bağlantı havuzu oluşturma, DBRef desteği ve hayatınızı kolaylaştırmak için diğer kolaylık yöntemleri gibi diğer bazı yardımcılarla sonuçların etrafında yalnızca bir nesne sarmalayıcıdır.

Adı Minimongo ve github'dan edinilebilir. Mutlu hacklemeler!

Misal:

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
Bu çok kullanışlı ve basit, sadece bir şey istedim, böylece sözlükler oluştururken takılıp kalmayayım, başka bir şey değil.
vishalv2050

1
Bu gerçekten güzel. Artık korunmaması çok kötü :(
eğer __name__ Yok ise

30

MongoKit istiyorsun . PyMongo'dan daha yüksek bir soyutlama katmanıdır . Django kullanıyor musunuz emin değilim ama django-mongokit entegrasyonu da var.

Bu blog gönderisinden örnek . Bilgisayar örneklerinin yapı tanımlandıktan sonra doğrudan make / model'e başvurabileceğini unutmayın (örn. Atari.make, c64.model, ...). Sözlüklere gerek yok:

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

Mevcut iş mantığı nesnelerini değiştirmeden bunu yapmanın bir yolu var mı? sqlalchemy'de, haritacıları kullanabilirsiniz.
Timmy

daha fazla cerrahi değişiklik. bağımlılık grafiğinizi temiz tutar. Bunu doğrudan yapmanın bir yolunu görmese de mantıklı. Belki MongoComputer sınıfı (Bilgisayar, Belge) veya bir çeşit karışım gibi garip bir şey? İlginç ...
Ryan Cox

sqlalchemy'de temiz, bu yüzden soru, thans
Timmy

2015'ten beri mongokit'te kod değişikliği yok ve 2014'ten beri sürüm yok. Lanet olsun, bu python dünyasını
anlamıyorum

15

Bu soruya gerçekten geç kaldığımı biliyorum, ancak Ming http://merciless.sourceforge.net , SQLAlchemy'den ilham alan MongoDB doğrulama ve ORM motorunun yazarıyım. SourceForge'da kullandığımız şeydir ve http://www.slideshare.net/rick446/rapid-and-scalable-development-with-mongodb-pymongo-and-ming adresinde makul bir sunum ve bir vaka çalışması mevcuttur. SQLAlchemy'den Ming'e geçiş http://www.slideshare.net/__amol__/from-sqlalchemy-to-ming-with-turbogears2 . Ming'deki ORM katmanına bir örnek (eğiticiden):

class WikiPage(MappedClass):

    class __mongometa__:
        session = session
        name = 'wiki_page'

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

Sorgular standart MongoDB sorgu sözdizimini kullanır (Django ORM'nin sihirli anahtar kelime bağımsız değişkenlerini değil):

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

Ming bizim için gidilecek yol gibi görünüyor. Hem esnekliğe hem de ihtiyacımız olan şema-benzeri kavramlara sahiptir. Güce ihtiyacımız olduğunda pymongo'ya düşeriz.
jochem

1
Mongo ve python'da yeniyim. Django'nun model.py gibi Modeller oluşturmak ve Ming kullanarak geçiş komut dosyaları oluşturmak için başvurabileceğim bir eğitim var mı?
Varad
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.