I spent ages trying to find a simple example where MongoEngine was being used and a connection was being closed. Finally figured it out and posting my code.
I know this is an old question, but if anyone else is searching I figured I'd give an alternate answer.
close()
does not actually remove the connection from MongoEngine's connection list. This causes problems when trying to connect to a different database later on.
To solve this I used mongoengine.connection.disconnect
(even though it's not listed in __all__
). My code looks like this:
from mongoengine import connect
from mongoengine.connection import disconnect
db = connect(alias='some_alias')
{do stuff}
disconnect(alias='some_alias')
You can also leave the alias out as it will default to 'default' in both connect and disconnect.
I thought disconnect()
was supposed to be used initially, but it has been removed as a synonym for 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()
The :meth:`MongoClient.disconnect` method is removed; it was a synonym for :meth:`~pymongo.MongoClient.close
–
Clack It can be managed with Connection class like bellow. It creates connection with __enter__ and closes it with __exit__ method.
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()
Then you can use it with "with" statement.
from app.connection import Connection
with Connection():
# do some stuff with db, connection will be closed after with statement
pass
According to the mongoengine docs
Calling disconnect() without argument will disconnect the “default” connection
As pointed out in accepted answer, in some cases it is important to definine "alias" when using connect and disconnect.
Experiments without defining "alias"
In my case connecting with alias='testdb' and disconnecting without defining 'alias' worked well until I moved my db and backend inside docker. For some reason, when running tests with mongomock inside docker I got the following errors:
mongoengine.connection.ConnectionFailure: A different connection with alias `testdb` was already registered. Use disconnect() first
and
mongoengine.connection.ConnectionFailure: You have not defined a default connection
Solution
After defining alias='testdb' also when disconnecting, everything worked well
© 2022 - 2025 — McMap. All rights reserved.
disconnect
instead of close – Annal