【问题标题】:Python (Mysql Connector) - How to refresh results on cursorPython(Mysql 连接器) - 如何刷新光标上的结果
【发布时间】:2014-09-27 07:16:28
【问题描述】:

在提问之前,我应该告诉你我是个菜鸟。

我的问题是我有 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 commited 之后,当循环返回到 "if (str(result[3]) == "None") :" 部分时,它仍然看到 result[3] 为 None。当我检查 MysqlDatabase 时,“entry1”似乎已成功更新。我想我需要以某种方式刷新 cursor2 中的结果,但我不知道如何。

我试图将 buffered 设置为 false,但出现无法摆脱的“未读结果”错误。 (就像我说我是菜鸟)。有什么建议吗?

【问题讨论】:

标签: python mysql cursor refresh connector


【解决方案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

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

【讨论】:

  • 谢谢,我还没来得及测试,但我相信这会解决我的问题。
猜你喜欢
  • 2014-11-08
  • 1970-01-01
  • 2014-08-04
  • 2017-01-19
  • 2012-06-20
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多