2012-05-26 2 views
2

대) (폐쇄와 함께 MySQL을 연결하고 나는이 같은 필기구의 피곤 쪘 :DB 연결 : SQLAlchemy의 사용 __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

자신에게 물어보십시오. 왜 그들이 '델'을 이미 가지고있을 때'와 함께 '추가 했습니까? 그런 다음 [문서] (http://docs.python.org/reference/datamodel.html#object.__del__)을보고 "참고"라는 단어가있는 거대한 회색 상자와 같은 힌트가 있는지 확인하십시오. 그 안에는 굵은 글씨로, 또는 더 나은 것은 거대한 * red * (OK, 분홍색) 상자에 "Warning"이라는 단어가 굵은 글씨로 표시되어 있습니다. – 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가 사용되도록 설계된 방식 일 것입니다 (API가 약간 짜증나는 경우 라 할지라도). – mgilson