It really depends on the library you're using. Some of them could be closing the connection on their own (Note: I checked the builtin sqlite3 library, and it does not). Python will call a destructor when an object goes out of scope, and these libraries might implement a destructor that closes the connections gracefully.
However, that might not be the case! I would recommend, as others have in the comments, to wrap it in an object.
class MyDB(object):
_db_connection = None
_db_cur = None
def __init__(self):
self._db_connection = db_module.connect('host', 'user', 'password', 'db')
self._db_cur = self._db_connection.cursor()
def query(self, query, params):
return self._db_cur.execute(query, params)
def __del__(self):
self._db_connection.close()
This will instantiate your database connection at the start, and close it when the place your object was instantiated falls out of scope. Note: If you instantiate this object at the module level, it will persist for your entire application. Unless this is intended, I would suggest separating your database functions from the non-database functions.
Luckily, python has standardized the Database API, so this will work with all of the compliant DBs for you :)