web-dev-qa-db-ja.com

Python用MongoDB ORM?

Sqlalchemy(SQlite)からmongodbの使用に移行しようとしています。スキーマの検証をお願いします。私はmongokitを見ていますが、辞書ではなくオブジェクトのプロパティから保存するために、マッパーに似たものが欲しいです。

既存のオブジェクトを変更せずに使用できるように、マッパーが必要です。

82
Timmy

別のオプションは MongoEngine です。 MongoEngineのORMは、Djangoが使用するORMと非常によく似ています。

例(チュートリアルから):

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()
66
David Narayan

MongoKitとMongoEngineのどちらにも満足できないので、私はPythonのオブジェクト指向インターフェースを自分で書くことにしました。

すべてのクエリを直接pymongoに委任したため、クエリの構文は同じです。ほとんどの場合、結果をオブジェクトラッパーにしただけで、データベース接続プーリング、DBRefサポート、その他の便利なメソッドなど、生活を楽にする他のヘルパーがあります。

Minimongo と呼ばれ、githubから入手できます。ハッピーハッキング!

例:

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
39
slacy

MongoKit が必要です。 PyMongo よりも高い抽象化の1つの層です。 Djangoを使用しているかどうかはわかりませんが、 Django-mongokit 統合もあります。

これからの例 ブログ投稿 。 Computerのインスタンスは、構造が定義されると、make/modelを直接参照できることに注意してください(例:atari.make、c64.model、...)。辞書は必要ありません:

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

私はこの質問に本当に遅れていることを知っていますが、私はSQLAlchemyにヒントを得たMongoDB検証およびORMエンジンであるMing​​ http://merciless.sourceforge.net の著者です。 SourceForgeで使用しているものであり、 http://www.slideshare.net/rick446/rapid-and-scalable-development-with-mongodb-pymongo-and-ming で利用可能な合理的なプレゼンテーションがありますSQLAlchemyからMingへの移行に関するケーススタディ http://www.slideshare.net/__amol__/from-sqlalchemy-to-ming-with-turbogears2 。以下は、MingのORMレイヤーの例です(チュートリアルから)。

class WikiPage(MappedClass):

    class __mongometa__:
        session = session
        name = 'wiki_page'

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

クエリは、標準のMongoDBクエリ構文を使用します(Django ORMのマジックキーワード引数ではありません):

WikiComment.query.find(dict(page_id=wp._id))
15
Rick Copeland