MongoEngine:关闭连接

Posted

技术标签:

【中文标题】MongoEngine:关闭连接【英文标题】:MongoEngine: Close connection 【发布时间】:2017-10-07 13:05:08 【问题描述】:

我花了很长时间试图找到一个使用 MongoEngine 并关闭连接的简单示例。终于想通了并发布了我的代码。

【问题讨论】:

【参考方案1】:

我知道这是一个老问题,但如果其他人在搜索,我想我会给出一个替代答案。

close() 实际上并没有从 MongoEngine 的连接列表中删除连接。这会在稍后尝试连接到不同的数据库时导致问题。

为了解决这个问题,我使用了mongoengine.connection.disconnect(尽管它没有在__all__ 中列出)。我的代码如下所示:

from mongoengine import connect
from mongoengine.connection import disconnect

db = connect(alias='some_alias')

do stuff

disconnect(alias='some_alias')

您也可以不使用别名,因为它在连接和断开连接时都默认为“默认”。

【讨论】:

【参考方案2】:

我以为 disconnect() 最初应该被使用,但它已作为 close() 的同义词被删除。

from mongoengine import connect

def main():

    #connect to db
    db_client = connect('my_db', host='localhost', port=27017)

    #close the connection
    db_client.close()

if __name__ == "__main__":
    main()

【讨论】:

这里是mongoengine的维护者,使用disconnect而不是close 这不是真的,在文档中:The :meth:`MongoClient.disconnect` method is removed; it was a synonym for :meth:`~pymongo.MongoClient.close【参考方案3】:

它可以通过如下所示的 Connection 类进行管理。它使用 __enter__ 创建连接并使用 __exit__ 方法关闭它。

from mongoengine import connect
from app.config import config


class Connection:
    def __enter__(self):
        self.conn = connect(host=config.mongo_url)
        return self.conn

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.conn.close()

然后你可以将它与 "with" 语句一起使用。

from app.connection import Connection

with Connection():
     # do some stuff with db, connection will be closed after with statement
     pass 

【讨论】:

【参考方案4】:

根据 mongoengine 文档

Calling disconnect() without argument will disconnect the “default” connection

正如接受的答案所指出的,在某些情况下,在使用连接和断开连接时定义“别名”很重要。

没有定义“别名”的实验

在我的情况下,使用 alias='testdb' 连接并在不定义 'alias' 的情况下断开连接效果很好,直到我将我的数据库和后端移动到 docker 中。出于某种原因,在 docker 内使用 mongomock 运行测试时出现以下错误:

mongoengine.connection.ConnectionFailure: A different connection with alias `testdb` was already registered. Use disconnect() first

mongoengine.connection.ConnectionFailure: You have not defined a default connection

解决方案

在断开连接时也定义了 alias='testdb' 后,一切正常

【讨论】:

以上是关于MongoEngine:关闭连接的主要内容,如果未能解决你的问题,请参考以下文章

未在 mongoengine 中创建与新 dbname 的连接

Python中使用MongoEngine2

如何为使用两个数据库(mysql和mongo)的django项目编写单元测试

带有 mongoengine 的 Flask 应用程序的 Elastic Beanstalk WSGI 部署的“您尚未定义默认连接”

Flask,Pymongo和Mongoengine - ImportError:无法导入名称'app'

Mongoengine:查询 MapField