【问题标题】:How do I access a MongoDB connection outside of a view in Pyramid?如何在 Pyramid 视图之外访问 MongoDB 连接?
【发布时间】:2015-02-08 18:55:55
【问题描述】:

我遵循了 MongoDB and Pyramid 的 Pyramid Cookbook 说明,但这似乎将数据库查询链接到 request.db,我只能从我的观点中获得。 如何打开可以从类方法内部调用的连接?

我正在尝试为我的项目中的对象设置一个真正的准系统序列化程序。我的resources/ 文件夹中有许多类定义来处理我的项目数据。我想为这些对象中的每一个提供自包含的.save().find() 方法(类似于mongoengine),它们会将对象的数据转换为字典并使用pymongo 将该字典保存到MongoDB。

使用pymongo 打开与 MongoDB 的连接非常简单。您所要做的就是使用MongoClient。问题是我不想每次实例化一个对象或调用一个类时都打开一个新连接。我想在 egg 的 main() 函数中建立一个连接,然后我可以在需要时访问它(就像视图中的 request.db 一样)。

显然,我是 Pyramid 的新手,因此我们不胜感激。提前致谢。

【问题讨论】:

    标签: mongodb pymongo pyramid


    【解决方案1】:

    我将创建一个模块来初始化并保存资源/包内的 MongDB 连接。

    例如资源/连接.py

    import pymongo
    
    db = None
    
    def initialize(settings):
      global db
      db = MongoClient(settings['mongo_uri'])
    

    然后在你的应用主函数中:

    from myapp.resources import connection
    
    
    def main(global_config, **settings):
      # ...
      connection.initialize(settings)
      # ...
      config.add_request_method(lambda request: connection.client, 'db', reify=True)
    

    在任何其他模块(不是视图)中,只需导入连接模块:

    from myapp.resources import connection
    
    connection.db.posts
    

    恕我直言,这种方法比食谱中描述的方法更具可扩展性和单元测试性。

    【讨论】:

    • 请注意,当线程开始发挥作用时,此方法可能会以不可预知的方式中断,您需要使用 threadlocal 对象。食谱的答案要好得多,这需要您将请求传递给您的模型,但在大多数情况下,这不是问题,并且提高了可测试性。
    • pymongo 的 MongoClient 是线程安全的,实际上充当连接池。 Link
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 2012-02-27
    • 2017-09-04
    • 1970-01-01
    相关资源
    最近更新 更多