아이디어는 여기 (내가 믿는) 사람이 너무 커서 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'])
일부는 생략했습니다. 오류 처리/연결이 끊어진 경우 데이터베이스에 다시 연결하는 코드의 일반적인 개념은 있습니다. 이렇게하면 커서가 필요하고 사용되며 범위를 벗어날 때 만들어 지므로 오류 처리를 중앙 집중화 할 수 있습니다.
'run_sql_command.c = c'를 설정할 필요가 없다고 생각합니다. 아마도 코드 작성자는 c가 내부 함수에 의해 여전히 액세스 가능하다는 것을 이해하지 못했을 것입니다. – rlotun