2012-05-26 30 views
2

使用的SQLAlchemy連接到MySQL和我已經得到厭倦了寫這樣的事情:DB連接:與關閉()VS __del__

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

這種圖案反覆出現的我的代碼許多領域,似乎與__del__的可用性,這是沒有必要的。爲什麼不只是實現一個類來包裝的連接建立和關閉:

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() 

這根本就是兩個不同的風格/偏好,還是有更重要的原因,使用with closing()是一種更好的方式去,使用__del__(或反之亦然)?

+0

問問自己:爲什麼當他們已經有del時加上'with'?然後,查看[文檔](http://docs.python.org/reference/datamodel.html#object.__del__)並查看是否有任何提示,例如帶有單詞「Note」的巨大灰色框,以黑體字表示,或者更好的是,用黑體字表示一個巨大的*紅色*(OK,粉紅色)框,其中帶有「警告」一詞。 – kindall

+0

@kindall - 謝謝,我已經閱讀了文檔,希望從社區獲得更多關於實踐中正在做什麼的信息。 –

+0

@ kindall - 並推論你的第一點,如果'__del__'被破壞了,他們爲什麼不刪除它? –

回答

4

關於何時實際調用__del__(或者在循環引用的情況下是否調用它)不能保證。 with closing(...) as ...:保證每當您退出with子句時都會調用清理代碼。

+0

謝謝,我想我可以通過SQLAlchemy使用'close_with_result'來簡化我的代碼。思考? http://docs.sqlalchemy.org/en/rel_0_7/core/connections.html#sqlalchemy.engine.base.ResultProxy –

+0

我實際上並沒有使用SQLAlchemy - 所以大部分東西對我來說沒有實際意義 - 我想這就是說,除了使用上下文管理器之外,我對這個問題沒有任何想法,可能是設計API使用的方式(即使您覺得它有點煩人)。 – mgilson