我在班上有这个方法:
def exec_query(self, dbms, connection_string, sql):
self.dbms = dbms
self.connection_string = connection_string
self.sql = sql
self._connection, self._cursor = self._mydb(self.dbms, self.connection_string)
self._result = None
self.query_result = []
try:
self._cursor.execute(self.sql)
self.collected_data = self._cursor
except Exception as e:
raise e
self._cursor.close()
self._connection.close()
return self.collected_data
然后我试着在课外得到它的回报值。我收到了这个错误:
pyodbc.ProgrammingError: Attempt to use a closed cursor.
我不能将光标分配给变量吗?为什么?
我想要做的是将光标处理在类之外。基本上,我可以做.fetchall()并获取数据,然后关闭光标。但.fetchall()吃掉了记忆。所以,我想把光标处理到外面。
答案 0 :(得分:0)
self.collected_data
只是与self._cursor
完全相同的对象的另一个名称。如果您关闭self._cursor
,则self.collected_data
也会关闭。
您需要使用
self.collected_data = self.cursor.fetch_all()
(或其他)保存实际数据,或保持连接和光标打开,在类外处理数据,然后调用close
方法。
您可能希望将您的课程设为context manager,然后使用以下内容:
with db_connection.exec_query(dbms, connection_string, sql) as data:
# process data
while data:
row in data.fetch_one()
do_something_with_row()
# on exit, cursor is closed
我可能有while data
错误的详细信息,但希望你能得到这个想法。你的exec_query看起来像这样:
class exec_query:
def __init__(self, dbms, connection_string, sql):
self.dbms = dbms
self.connection_string = connection_string
self.sql = sql
self._connection, self._cursor = self._mydb(self.dbms, self.connection_string)
self._result = None
self.query_result = []
self._cursor.execute(self.sql)
def __enter__(self):
return self._cursor
def __exit__(self, *args):
self._cursor.close()
self._connection.close()