我想在我的Tornado应用程序中使用Motorengine。正如docs中给出的,这就是我应该如何制作ODM
pg_dump -C --column_inserts -U remoteuser -h remotehost > my_backup.sql
# copy the file to the server you want
# change the desired parameter like the database name
nano my_baskup.sql
createdb -U newuser -h localhost newdb_name
psql -U newuser -h localhost postgres < my_backup.sql
令人困惑的是,一旦创建实例,它是否会与数据库保持一致的连接?我想要对所有模型使用数据库进行非阻塞I / O操作,因此如果确实如此,这不是问题。但我不应该为用户模型实现它,我将在验证时只访问一次。是否有正常的方式来访问用户数据?
另外,我不清楚一些事情:
最后两行(ioloop)究竟在这做什么?
我在单独的文件中声明了不同的模型,我是否每个文件都有from motorengine.document import Document
from motorengine.fields import StringField, DateTimeField
class Article(Document):
title = StringField(required=True)
description = StringField(required=True)
published_date = DateTimeField(auto_now_on_insert=True)
new_title = "Better Title %s" % uuid4()
def create_article():
Article.objects.create(
title="Some Article",
description="This is an article that really matters.",
callback=handle_article_created
)
def handle_article_created(article):
article.title = new_title
article.save(callback=handle_article_updated)
def handle_article_updated(article):
Article.objects.find_all(callback=handle_articles_loaded)
def handle_articles_loaded(articles):
assert len(articles) == 1
assert articles[0].title == new_title
articles[0].delete(callback=handle_article_deleted)
def handle_article_deleted(number_of_deleted_items):
try:
assert number_of_deleted_items == 1
finally:
io_loop.stop()
io_loop.add_timeout(1, create_article)
io_loop.start()
?这对我来说似乎很奇怪。
请帮帮我。感谢。
答案 0 :(得分:2)
阅读MotorEngine的代码,在我看来,您使用MongoDB执行的每个操作(如Article.objects.create
)都会检查MotorClient
实例并尽可能重用一个实例。这是连接缓存并从缓存中查找的位置:
https://github.com/heynemann/motorengine/blob/master/motorengine/connection.py#L62
每个MotorClient
都维护着一个IOStream的持久池,所以你问题的答案是肯定的。
IOLoop.start
启动您的应用程序服务器。你应该在一个文件中调用一次。对start
的调用将永远运行,或直到您终止该进程。
add_timeout
调用只是演示MotorEngine功能的一种方式,它等待一秒然后调用create_article
。在实际应用中你不会做那样的事情;您可能会直接在create_article
中拨打RequestHandler
,而不会add_timeout
。