2011-09-07 5 views
1

웹에서 아래를 찾았지만 약간의 Python 노출로 인해 함수를 객체에 즉시 연결할 수 있음을 알고 있습니다. 나는 또한 파이썬의 모든 것이 객체라는 것을 알고있다. 나는 아래와 그것의 유스 케이스로 달성하고자하는 것을 아직 이해하지 못하고있다. 이것은 내가 도움을 필요로하는 부분이다 :파이썬 코드 스 니펫 해석하기 도움말

run_sql_command.c을 = C

def get_sql_object(c): 
    def run_sql_command(command, arguments=[]): 
     c.execute(command, arguments) 
     return c.fetchall() 
    run_sql_command.c = c 
    return run_sql_command 
+0

'run_sql_command.c = c'를 설정할 필요가 없다고 생각합니다. 아마도 코드 작성자는 c가 내부 함수에 의해 여전히 액세스 가능하다는 것을 이해하지 못했을 것입니다. – rlotun

답변

0

해당 줄은 run_sql_command 특성에 c 특성을 추가하여 get_sql_object(), 아마도 데이터베이스 커서로 전달되는 값을 제공합니다. 당신은 아마 이미 그 정도를 알고있었습니다.

이 스 니펫의 범위가 제한되어있어 문구가 전혀 사용되지 않습니다. 더 큰 맥락에서, 커서는 코드의 다른 곳에서 재사용 될 수 있습니다. 코드의 다른 부분에있는 .c 속성에 대한 액세스를 찾아서 수행 한 작업을 확인하십시오.

3

아이디어는 여기 (내가 믿는) 사람이 너무 커서 c에 대한 참조를 유지하는 자리 표시 자 개체를 만드는 것입니다 나중에 쿼리를 실행하는 데 사용될 수 있습니다. 제안 된 사용은 아마도이 같은 것입니다 : - 의견의 일부 해결하려면 -

c = DBConnectionObject.cursor() 

myExecutor = get_sql_object(c) 

# some amount of code later 
rows = myExecutor(Queries.GetAllUsersByFName, ['Larry', 'Bob']) 

내가 주변에 커서를 유지하려고하는 것은이 항상 보장 아니에요 휘발성 환경에서 문제를 일으킬 수 있다는 것을 발견을 데이터베이스 연결이 연결된 상태로 유지됩니다. 당신이 그렇게 같은 글로벌 데이터베이스 연결을 만들 것, 그리고

class DBConnection(object): 
    def __init__(self, dbpath): 
    self.dbPath = dbpath 

    # Any connection object here, really. 
    self._conn = kinterbasdb.connect() 

    def cursor(self, query, params = None): 
    try: 
     cursor = self._conn.cursor() 

     if params: 
     cursor.execute(query, params) 
     else: 
     cursor.execute(query) 

     return cursor 
    except (kdb.ProgrammingError, AttributeError), e: 
     print e 

    def qry(self, query, params = None): 
    cursor = self.cursor(query, params) 

    return [[x[0].title() for x in cursor.description]] + [r for r in cursor.fetchall()] 

:

dbcon = DBConnection('/path/to/mydb.fdb') 

와 함께 쿼리를 실행 :

rows = dbcon.qry(Queries.GetSomething) 

나 : 내가 대신이 방법을 선택

filtered = dbcon.qry(Queries.FilteredQuery, ['my', 'parameters']) 

일부는 생략했습니다. 오류 처리/연결이 끊어진 경우 데이터베이스에 다시 연결하는 코드의 일반적인 개념은 있습니다. 이렇게하면 커서가 필요하고 사용되며 범위를 벗어날 때 만들어 지므로 오류 처리를 중앙 집중화 할 수 있습니다.

+0

위의 내용은 자리 표시자를 만들지 않고도 작업 할 수 있습니다. – user618677

+0

@ user618677 - 아마도. 나는 그 발췌 내용을 정당화하지 않고 단순히 설명하려고 시도했다. 개인적으로 커서를 유지하는 것이 다른 접근 방법보다 덜 유용하다는 것을 발견했습니다. 내가 보여줄 수있는 초 안에 여기에 붙여 넣을거야. –

0

나는 run_sql_command.c이 (가) 예를 들어,에 대한 액세스 가능한 참조를 유지할 수 있다고 생각합니다. 나중에 닫으십시오.