2012-02-25 8 views
61

誰かがMongoKit、MongoEngine、Flask-MongoAlchemy for Flaskの経験がありますか?MongoKit vs MongoEngine vs Flask-MongoAlchemy for Flask

どちらをお好みですか?肯定的または否定的な経験? Flask-Newbieのオプションが多すぎます。

+37

このユーザーの質問を終了するには少し厳しいですね。私はそれが役に立ちました。 – RubyGladiator

+1

同上、私もそれが役に立つと思った。 – Tim

+0

優秀な答え、私はそれが役に立つと思った、私は他の人が良いアイデアを持っていると賭ける - 再オープン? –

答えて

77

私はMongoDBの一般的なPython ORMを評価するのに多くの時間を費やしました。私は本当に1つを選びたかったので、これは徹底的な運動でした。

私の結論は、ORMがMongoDBからの不幸を取り除くことです。誰も私が最初にリレーショナルデータベースから離れさせるような制限を課しています。

また、私は本当にORMを使いたいと思っていましたが、今ではpymongoを使用すると直接行くことができると確信しています。今、私はMongoDB、、およびPythonを包含するパターンに従います。

リソース指向アーキテクチャは、非常に自然な表現につながります。たとえば、次のユーザーのリソース取る:

from werkzeug.wrappers import Response 
from werkzeug.exceptions import NotFound 

Users = pymongo.Connection("localhost", 27017)["mydb"]["users"] 


class User(Resource): 

    def GET(self, request, username): 
     spec = { 
      "_id": username, 
      "_meta.active": True 
     } 
     # this is a simple call to pymongo - really, do 
     # we need anything else? 
     doc = Users.find_one(spec) 
     if not doc: 
      return NotFound(username) 
     payload, mimetype = representation(doc, request.accept) 
     return Response(payload, mimetype=mimetype, status=200) 

    def PUT(self, request, username): 
     spec = { 
      "_id": username, 
      "_meta.active": True 
     } 
     operation = { 
      "$set": request.json, 
     } 
     # this call to pymongo will return the updated document (implies safe=True) 
     doc = Users.update(spec, operation, new=True) 
     if not doc: 
      return NotFound(username) 
     payload, mimetype = representation(doc, request.accept) 
     return Response(payload, mimetype=mimetype, status=200) 

Resource基底クラスは

class Resource(object): 

    def GET(self, request, **kwargs): 
     return NotImplemented() 

    def HEAD(self, request, **kwargs): 
     return NotImplemented() 

    def POST(self, request, **kwargs): 
     return NotImplemented() 

    def DELETE(self, request, **kwargs): 
     return NotImplemented() 

    def PUT(self, request, **kwargs): 
     return NotImplemented() 

    def __call__(self, request, **kwargs): 
     handler = getattr(self, request.method) 
     return handler(request, **kwargs) 

のような私が直接 WSGIスペックを使用することに注意してください、そして、レバレッジ Werkzeug可能(ちなみに、私が思うに見えます Flaskは不要な合併症を Werkzeugに追加します)。

機能representationは、要求のAcceptヘッダをとり、そして適切な表現(例えば、application/json、又はtext/html)を生成します。実装するのは難しくありません。 Last-Modifiedヘッダーも追加されます。

もちろん、あなたの入力は消毒される必要があり、提示されたコードは機能しません(私は例として意味しますが、私のことを理解することは難しくありません)。

また、私はすべてを試しましたが、このアーキテクチャーは柔軟でシンプルで拡張可能なコードにしました。

+9

+1。 Mongoの上にORMは必要ありません。 Pymongoを直接使用すると、完全な自由が得られます。 – sojin

+0

優秀な答え! – RubyGladiator

+0

私はこの回答が気に入っていますが、ほとんどの場合、mongoのベストプラクティスはフィールド名を短くすることであるため、単にmongoコレクションを直接返すだけでは簡単ではないことに注意してください...特にユーザーのコレクションサイトがトラフィックが多い場合)や分析データなど。基本的に、私の質問は、あなたの残りのアプリケーションで短縮された場合、フィールド名を変換する方法についてはどうですか? (ディスクとメモリの消費を節約するためにu - > username、e - > emailなど) – Jordan