Python (MySQL 连接器) - 如何刷新游标结果
在问问题之前,我得先说我还是个新手。
我遇到的问题是我有两个游标(在不同的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 个回答
你遇到的“未读结果”错误是因为你没有从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()
,根据第一次获取的数据更新表中的所有行。