谁有使用MongoKit,MongoEngine或Flask-MongoAlchemy的经验?
你喜欢哪一种?积极的经历还是消极的经历?对一个酒瓶新手来说选择太多了。
发布于 2012-02-26 04:27:59
我花了很多时间评估用于MongoDB的流行的Python ORMs。这是一个详尽的练习,因为我真的很想选择一个。
我的结论是,对象关系映射消除了MongoDB的乐趣。没有一种感觉是自然的,他们施加的限制类似于最初让我远离关系数据库的那些限制。
同样,我真的很想使用对象关系映射,但现在我确信直接使用pymongo
是可行的。现在,我将遵循一个包含MongoDB、pymongo
和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
标头。
当然,您的输入需要进行清理,并且所提供的代码将无法工作(我的意思是举个例子,但这并不难理解我的观点)。
同样,我尝试了所有方法,但这种体系结构使我的代码灵活、简单和可扩展。
https://stackoverflow.com/questions/9447629
复制相似问题