数据库访问生成器功能是否有优势?

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)

Wul*_*ram 5

不。从功能上讲,它们是相同的,但是,如果您想重用代码,则将其包装在生成器中是有好处的。例如,您可以添加代码以在读取生成器块后关闭连接/光标。我建议您将此代码添加到上面的代码中,以便关闭游标。

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)

这将使重用变得更容易,因为您只需要在一个地方正确地进行连接管理即可。