我有以下方法可以访问 mysql 数据库,并且查询在服务器中执行,而我无权更改有关增加内存的任何内容。我是生成器的新手,并开始阅读有关它的更多信息,并认为我可以将其转换为使用生成器。
def getUNames(self):
globalUserQuery = ur'''SELECT gu_name FROM globaluser WHERE gu_locked = 0'''
global_user_list = []
try:
self.gdbCursor.execute(globalUserQuery)
rows = self.gdbCursor.fetchall()
for row in rows:
uName = unicode(row['gu_name'], 'utf-8')
global_user_list.append(uName)
return global_user_list
except Exception, e:
traceback.print_exc()
我使用此代码如下:
for user_name in getUNames():
...
这是我从服务器端得到的错误:
^GOut of memory (Needed 725528 bytes)
Traceback (most recent call last):
...
packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
OperationalError: (2008, 'MySQL client ran out of memory')
我应该如何使用生成器来避免这种情况:
while true:
self.gdbCursor.execute(globalUserQuery)
row = self.gdbCursor.fetchone()
if row is None: break
yield row
不确定以上是否是正确的方法,因为我期望我的数据库方法会产生一个列表。我认为最好的是从查询中获取块并返回一个列表,一旦完成,只要查询返回结果,生成器就会给出下一个集合。