我正在尝试编写一个生成器函数,该函数从数据库中获取行并一次返回一个。但是,我不确定下面标记为 ** 的清理代码是否像我认为的那样执行。如果没有,将清理代码放入生成器本身的最佳方法是什么,该生成器在最后一个 yield 语句之后执行?我看着捕捉 StopIteration 但这似乎是从调用者那里完成的,而不是在生成器中。
def MYSQLSelectGenerator(stmt):
...
try:
myDB = MySQLdb.connect(host=..., port=..., user=..., passwd=..., db=...)
dbc=myDB.cursor()
dbc.execute(stmt)
d = "asdf"
while d is not None:
d = dbc.fetchone() #can also use fetchmany() to be more efficient
yield d
dbc.close() #** DOES THIS WORK AS I INTEND, MEANING AS SOON AS d = "None"
except MySQLdb.Error, msg:
print("MYSQL ERROR!")
print msg