Python(Mysql Connector) - 如何刷新游标上的结果

时间:2014-08-04 18:18:49

标签: python mysql cursor refresh connector

在回答问题之前,我应该告诉你我是新手。

我的问题是我有2个游标(在不同的sql连接上),第一个游标从sql数据库获取结果,而第二个游标在结果中对行进行更改。问题是我想在第二个光标进行更改后刷新第一个光标结果的内容。

我的游标在缓冲的sql连接上工作。

我遇到的部分代码(我删除了一些不必要的行):

// more loops here before the sample -

    cursor2.execute(query2)
    for result in cursor2 : 

        if (str(result[3]) == "None") :
            name = result[1]
            query3 = ("UPDATE accounts SET entry1 = %s WHERE name = %s")
            cursor3.execute(query3,(entry,name))
            sql3.commit()
            break

        elif (str(result[4]) == "None") :
            name = result[1]
            query3 = ("UPDATE accounts SET entry2 = %s WHERE name = %s")
            cursor3.execute(query3,(entry,name))
            sql3.commit()
            break

此示例似乎没有用,但是; 结果[3]给我列“entry1”,结果[4] =“entry2”。

Cursor3根据情况更改entry1或entry2的内容。但是在cursor3提交之后,当循环返回到“if(str(result [3])==”None“):”part时,它仍然将结果[3]视为无。当我检查MysqlDatabase时,“entry1”似乎已成功更新。我想我在某种程度上需要刷新cursor2中的结果,但我不知道如何。

我试图将缓冲变为假,但我有“未结果的结果”错误,我无法摆脱。 (就像我说我是新手)。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

您正在使用正常光标获取未读结果错误,因为您还没有全部阅读 来自cursor2的行,您将通过cursor3在同一连接上发送查询。 使用buffered=True,游标将获取execute中的所有行并将它们保留在内存中,但由于数据在内存中而不是在每次迭代中从服务器获取,因此它包含过时数据。

因此,要在每次迭代中更新数据,您需要每次都运行cursor2.execute,同时使用cursor.fetchall()返回一个元组元组,每个元组都是一行。

cursor2.execute(query2)
rows = cursor2.fetchall()

while i < len(rows): 
    result = rows[i]
    i += 1
    if (str(result[3]) == "None") :
        name = result[1]
        query3 = ("UPDATE accounts SET entry1 = %s WHERE name = %s")
        cursor3.execute(query3,(entry,name))
        sql3.commit()
        cursor2.execute(query2)
        rows = cursor2.fetchall()
        i=0

    elif (str(result[4]) == "None") :
        name = result[1]
        query3 = ("UPDATE accounts SET entry2 = %s WHERE name = %s")
        cursor3.execute(query3,(entry,name))
        sql3.commit()
        cursor2.execute(query2)
        rows = cursor2.fetchall()
        i=0

但这根本不是一个好的解决方案,因为对于包含entry1或条目2的每一行None,您将执行一次执行并将获取所有数据 好的方法是调用cursor.execute()一次,然后使用rows = cursor.fetchall()并根据第一次获取的数据更新表中的所有行。

相关问题