17

私は、 ODM/ORMと超高速の直接辞書読み取りという2つの世界から最高のものを引き出すMondoDBPythonODM/ORMを探しています。

言い換えると、パッケージは次の要件に準拠する必要があります。

  1. スキーマを定義および適用できます。
  2. フィールドを検証できます。
  3. mongodbからオブジェクトを直接読み取ることができます(ODM / ORMオーバーヘッドなし)。
    • pymongoによって直接返されるコレクション/オブジェクトは、ODM / ORMレイヤーを使用してアクセスできます(追加のクエリなし)。
    • ORMジュースへのアクセスを提供するオブジェクトにpymongoドライバーによって追加されたある種の怠惰なフィールドを想像します(pymongoはそのような拡張を可能にします)。
    • ユースケースを想像してみてください。
      • 速く読むために、私たちは直接ドライバーに行きます、
      • データ入力には、完全なODM/ORM機能を使用します
  4. ジオフィールドのサポート
  5. 通常のファイルと画像のGridFSサポート
  6. DBRefサポート
  7. 隠されたフレームワーク固有のフィールドを強制しません
  8. Flaskで動作します:)
  9. フォームフレームワークがあります。
    • フォームはサブリスト/サブディクトをカバーします
    • バックボーンベースのフォームは素晴らしいでしょう
  10. Python定義に基づいて、バックボーンモデル、コレクション、バリデーターを作成します

私は多くを求めていることを知っていますが、このようなものがあるのは素晴らしいことではないでしょう:)

実際、質問は次のように言い換えることができます。「既存のPython Mongodb ODM / ORM(MongoKit、MongoEngine)のどれをこの方法で簡単に拡張できるか」。

4

4 に答える 4

10

第一に、私もそれを持っていたいです。

私の研究に基づいて

Ming は非常に有望な mongo ODM ドライバーです: http://merciless.sourceforge.net/

MongoEngine は大きすぎて、要件/ユースケースに適応できません。MongoKit についても同様です。

micromongo には希望があります: http://packages.python.org/micromongo

良い出発点になるかもしれません。

ところで:うーん...何を書いているのかわかりませんが、フォームとバリデータをカバーすることで、管理インターフェイスを簡単に構築でき、最終的に次世代の Django を使用できます。幸運を!

于 2012-04-21T19:57:12.830 に答える
4

ORM の理論を採用する場合、必要なのは ORM ではありません。MongoDB はリレーショナル データベースではないため、リレーショナル エンティティへのマッピングは必要ありません。

Mongoと Python の両方の「性質」のため、私は個人的に MongoDB + Python を直接使用しています。

周りを見回すと、 mongoEngineに役立つこのライブラリが見つかりました。Django ORM のようなものです。あなたはそれをチェックする必要があります。

于 2012-04-20T19:16:39.830 に答える
2

マングースに大いに影響を受けた pymongoext https://github.com/musyoka-morris/pymongoext をご覧ください

主な機能は次のとおりです。

  • カスタムクエリ言語や API を学ぶ必要はありません (pymongo の使用方法を知っている場合は、pymongoext の使用方法を既に知っています)。
  • 辞書のようなものではなく、オブジェクトのような結果になります。これらのオブジェクトは dict を拡張するため、どちらの構文 (つまり、foo.bar または foo['bar']) も使用できます。
  • 保存前および取得後にドキュメントを変換するためのカスタム データ マニピュレータ。(マングース バーチャルに触発)
  • スキーマ検証 (MongoDB JSON スキーマ検証を使用)
  • ネストされた複雑なスキーマ宣言
  • 必須フィールドの検証
  • デフォルト値
  • カスタムバリデーター
  • 検証用演算子 (OneOf、AllOf、AnyOf、Not)
  • インデックス管理 (Pymongoext は MongoDB インデックスのメンテナンスを透過的かつインテリジェントに処理します)

使用例:

from datetime import datetime
from pymongo import MongoClient, IndexModel
from pymongoext import *


class User(Model):
    @classmethod
    def db(cls):
        return MongoClient()['my_database_name']

    __schema__ = DictField(dict(
        email=StringField(required=True),
        name=StringField(required=True),
        yob=IntField(minimum=1900, maximum=2019)
    ))

    __indexes__ = [IndexModel('email', unique=True), 'name']

    class AgeManipulator(Manipulator):
        def transform_outgoing(self, doc, model):
            doc['age'] = datetime.now().year - doc['yob']
            return doc


# Create a user
>>> User.insert_one({'email': 'jane@gmail.com', 'name': 'Jane Doe', 'yob': 1990})

# Fetch one user
>>> user = User.find_one()

# Print the users age
>>> print(user.age)
于 2019-04-13T09:00:21.020 に答える