DB connections: with closing() vs __del__

Using SQLAlchemy to connect to MySQL and I've gotten tired of writing things like this:

with closing(engine) as connection:
    do_sql_stuff(connection)

This pattern is repeated throughout many areas of my code and it seems with the availability of __del__ this is not necessary. Why not just implement a class to wrap the connection creation and closing:

class MyConnectionManager(object):
    def __init__(self, db_uri):
        self.__db_engine = sqlalchemy.create_engine(db_uri)
        self.__db_conn = self.__db_engine.connect()

    def __del__(self):
        self.__db_conn.close()

Is this simply two different styles/preferences, or are there more important reasons that using with closing() is a better way to go that using __del__ (or vice versa)?

Answers


There is no guarantee about when __del__ is actually called (or if it is called at all in the case of circular references). with closing(...) as ...: guarantees that the cleanup code is called whenever you exit the with clause.


Need Your Help

Maven error - Spring Surf Alfresco

spring maven spring-mvc pom.xml alfresco

To construct a project Spring Surf on Alfresco, I used the command: