Python (MySQL 连接器) - 如何刷新游标结果

0 投票
1 回答
7512 浏览
提问于 2025-04-18 15:57

在问问题之前,我得先说我还是个新手。

我遇到的问题是我有两个游标(在不同的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

这个示例看起来没什么帮助,但;Result[3]给我的是“entry1”这一列,result[4]是“entry2”。

Cursor3会根据情况修改entry1或entry2的内容。但是在Cursor3提交后,当循环回到“if (str(result[3]) == "None") :”这一部分时,它仍然把result[3]看作是None。当我检查MysqlDatabase时,“entry1”似乎已经成功更新。我觉得我需要在cursor2中以某种方式刷新结果,但我不知道该怎么做。

我尝试把缓冲设置为false,但我遇到了“未读结果”的错误,搞得我无从下手。(就像我说的,我还是个新手)。有什么建议吗?

1 个回答

1

你遇到的“未读结果”错误是因为你没有从cursor2中读取所有行,而是在同一个连接上通过cursor3发送查询。使用 buffered=True 时,光标会在执行时获取所有行并将它们保存在内存中,但由于数据是在内存中,而不是每次都从服务器获取,所以可能会包含过时的数据。

为了在每次迭代中更新数据,你需要每次都运行 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或entry2是 None,你就会执行一次查询并获取所有数据。更好的方法是调用 cursor.execute() 一次,然后使用 rows = cursor.fetchall(),根据第一次获取的数据更新表中的所有行。

撰写回答