Python用のMongoDBORM?[閉まっている]


85

sqlalchemy(SQlite)からmongodbを使用するように移行しようとしています。スキーマの垂直化をお願いします。私はmongokitを見ていますが、マッパーに似たものが必要です。これにより、dictではなく、オブジェクトのプロパティから保存されます。

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


1
正確には、「DRM」(ドキュメント-リソース-マッピング)と呼ばれる必要があります
zs2020 2012年

これは、クエリに答えるのに役立つはずですdocs.mongodb.org/ecosystem/drivers/php-libraries
Basav

属性または辞書アクセスを介してモンゴルオブジェクトと対話できるmongoliaというライブラリがあり、有効にできるスキーマ検証があります:github.com/zagaran/mongolia
Zags

@zsong Relational and Document ...オブジェクトリレーショナルおよびオブジェクトドキュメントと呼ばれるべきではありませんか?
Jaime Sangcap 2015

これは役に立つかもしれ:pythonhosted.org/Flask-MongoAlchemy
シャオ

回答:


69

もう1つのオプションは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()

16
私の知る限り。mongoengineのドキュメントにその場でプロパティを追加することはできません。どのような種類のmongodbからいくつかの楽しみを奪います。
tutuca 2011

9
必要に応じて、DictFieldを使用して、あらゆる種類の完全にスキーマレスのデータを追加できます。
neuman 2012年

またはGenericEmbeddedDocument?
tunnuz 2014

Mongoengineにはいくつかの深刻なパフォーマンスの問題があります。本番環境で使用する場合は、非常にシンプルで軽量なスキーマがある場合にのみ機能します。
バレリーR.コフマン2017年

3
Pythonで利用可能なMongoDBORMのより包括的な概要を探している人のために、PyMongoの「ツール」ページにはそれらのかなりの数がリストされており、定期的に維持されています:api.mongodb.com/python/current/tools.html
Ascendant

40

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

1
これは非常に便利でシンプルです。辞書の作成に行き詰まらないように、何かが欲しかったのです。
vishalv2050 2015年

1
これは本当にいいです。あまりにも悪いのはもう維持されていない:(
__name__がなしの場合は

30

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

既存のビジネスロジックオブジェクトを変更せずにこれを行う方法はありますか?sqlalchemyでは、マッパーを使用できます。
ティミー2010年

より多くの外科的変化。依存関係グラフをクリーンに保ちます。これを直接行う方法はわかりませんが、理にかなっています。たぶん、クラスMongoComputer(Computer、Document)のような奇妙なもの、または何らかの形のミックスインがありますか?興味深い...
ライアン・コックス

sqlalchemyでのクリーン、したがって質問、ありがとう
Timmy

2015年以来、mongokitでのコードの変更はなく、2014年以来気がないのリリース、私はこのPythonの世界を得ることはありません。:(
JAR.JAR.beans

15

私はこの質問に本当に遅れていることを知っていますが、私はMing http://merciless.sourceforge.netの著者であり、SQLAlchemyに触発されたMongoDB検証およびORMエンジンです。これは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))

明は私たちにとって道のりのようです。柔軟性と、必要なスキーマ風の概念の両方を備えています。電力が必要な場合は、pymongoにドロップダウンします。
jochem 2012年

1
私はmongoとpythonを初めて使用します。djangoのmodel.pyのようなモデルを作成し、Mingを使用して移行スクリプトを作成するために参照できるチュートリアルはありますか。
varad 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.