您的位置:首页 > 数据库 > Mongodb

tornado中使用motor异步操作mongodb

2013-12-31 00:11 447 查看
http://motor.readthedocs.org/en/stable/

motor是一个建立在tornado和mongodb上的异步操作库,能够实现所有的mongodb操作。

一:导入module

import motor

二:连接mongodb

[python] view
plaincopy

db = motor.MotorClient('10.28.0.163').open_sync().project_test

与pymongo的不同在与使用motor时必须加上 open_sync(),这里的连接时异步的。

相同情况下使用pymongo的命令为:

[python] view
plaincopy

db = pymongo.Connection('10.28.0.163').project_test

#这样是blocking的

三:操作mongodb

motor主要提供了两种操作mongodb的形式

1:第一种是在原有pymongo操作的基础上加入了回调函数

例如

[python] view
plaincopy

#原来的pymongo操作

find = db.test.find_one({'key':'value'})

new = db.test.update({'spec':'spec'},{'$set':{'key':'value'}})

[python] view
plaincopy

#motor操作

find = db.test.find_one({'key':'value'},callback=_on_result1)

new = db.test.update({'spec':'spec'},{'$set':{'key':'value'}},callback = _on_result2)

@tornado.web.asynchronous

def _on_result1(result,error):

if error:

do something

do something

def _on_result1(result,error):

if error:

do something

do something

关于某些mongodb操作的回调函数的使用,motor有特别的规定,如find()需要调用motor的to_list(),具体情况需要用时请查询motor文档http://motor.readthedocs.org/en/stable/index.html

2.第二种方法, motor还提供了基于tornado的gen模块的操作,简单来说就是不在需要调用回调函数,而是采用yield来实现异步。

还是用上面的两个命令为例:

[python] view
plaincopy

#motor操作

import tornado

import motor

class someHandler(tornado.web.RequestHandler):

@tornado.web.asynchronous

def post(self):

......do something....

self.operation(db)

....do something ....

@tornado.gen.engine

def operation():

find = yield motor.Op(db.test.find_one,{'key':'value'})

new =yield motor.Op(db.test.update,{'spec':'spec'},{'$set':{'key':'value'}})

这里,yield motor.Op(...) 将里面的内容异步执行,并根据异步执行的结果返回不同的值:

若执行结果是一个error,则返回error=some_error

若执行结果没有出错,则返回result = some_result

需要注意的是若要使用这种方法必须要加上标识@tornado.gen.engine
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: