我的问题是我有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中的结果,但我不知道如何。
我试图将缓冲变为假,但我有“未结果的结果”错误,我无法摆脱。 (就像我说我是新手)。有什么建议吗?
答案 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()
并根据第一次获取的数据更新表中的所有行。