在提问之前我应该告诉你我是一个菜鸟。
我的问题是我有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”。
光标3根据情况改变entry1或entry2的内容。但是在cursor3提交之后,当循环返回到“if (str(result[3]) == "None") :”部分时,它仍然将result[3]视为None。当我检查 MysqlDatabase 时,“entry1”似乎已成功更新。我想我需要以某种方式刷新光标2中的结果,但我不知道如何。
我尝试将缓冲设置为 false,但出现了无法消除的“未读结果”错误。 (就像我说的,我是菜鸟)。有什么建议吗?
最佳答案
您在正常光标下遇到未读结果发现错误,因为您尚未阅读全部内容 来自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()并根据获取的数据更新表中的所有行第一次。
关于Python(Mysql 连接器)-如何刷新光标上的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25125055/