oct*_*bus 4 python generator mysql-python
与仅.fetchone()在while循环中调用相比,编写以下生成器函数是否有优势?如果是这样,那优势是什么?
谢谢。
def testf2():
db = connectToMysqlDB(None)
sql_statement = " ".join([
"select d.* ",
"from dr_snapshot d ",
"order by d.PremiseID asc, d.last_read asc; "])
sel_cur = db.cursor()
rc = sel_cur.execute(sql_statement)
loop_ok = True
while loop_ok:
meter_row = sel_cur.fetchone()
if meter_row:
yield meter_row
else:
loop_ok = False
yield None
for read_val in testf2():
print(read_val)
#Perform something useful other than print.
('610159000', 6, datetime.datetime(2012, 7, 25, 23, 0), 431900L, 80598726L)
('610160000', 6, datetime.datetime(2012, 7, 25, 23, 0), 101200L, 80581200L)
None
Run Code Online (Sandbox Code Playgroud)
不。从功能上讲,它们是相同的,但是,如果您想重用代码,则将其包装在生成器中是有好处的。例如,您可以添加代码以在读取生成器块后关闭连接/光标。我建议您将此代码添加到上面的代码中,以便关闭游标。
def testf2():
try:
db = connectToMysqlDB(None)
sql_statement = " ".join([
"select d.* ",
"from dr_snapshot d ",
"order by d.PremiseID asc, d.last_read asc; "])
sel_cur = db.cursor()
rc = sel_cur.execute(sql_statement)
loop_ok = True
while loop_ok:
meter_row = sel_cur.fetchone()
if meter_row:
yield meter_row
else:
loop_ok = False
except ProgrammingError:
print "Tried to read a cursor after it was already closed"
finally:
sel_cur.close()
Run Code Online (Sandbox Code Playgroud)
这将使重用变得更容易,因为您只需要在一个地方正确地进行连接管理即可。