Python3中mysql select上返回的上一次更新的结果
我有一个在服务器上运行的脚本,该脚本更新MySQL数据库中的项目列表,以供桌面上运行的另一个脚本处理。脚本以循环方式运行,每5分钟处理一次列表(服务器端脚本也以5分钟为周期运行)。在第一个循环中,脚本检索当前列表(基本选择操作),在第二个循环中,脚本获取相同版本(未更新)的列表,在第三个循环中,脚本获取在第二次循环中应该获取的列表。在第一次之后的每次传递中,SELECT操作都会返回上一次更新操作的数据Python3中mysql select上返回的上一次更新的结果,python,mysql,python-3.x,Python,Mysql,Python 3.x,我有一个在服务器上运行的脚本,该脚本更新MySQL数据库中的项目列表,以供桌面上运行的另一个脚本处理。脚本以循环方式运行,每5分钟处理一次列表(服务器端脚本也以5分钟为周期运行)。在第一个循环中,脚本检索当前列表(基本选择操作),在第二个循环中,脚本获取相同版本(未更新)的列表,在第三个循环中,脚本获取在第二次循环中应该获取的列表。在第一次之后的每次传递中,SELECT操作都会返回上一次更新操作的数据 def mainFlow(): activeList=[] d=()
def mainFlow():
activeList=[]
d=()
a=()
b=()
#cycleStart=datetime.datetime.now()
cur = DBSV.cursor(buffered=True)
cur.execute("SELECT list FROM active_list WHERE id=1")
d=cur.fetchone()
DBSV.commit()
a=d[0]
b=a[0]
activeList=ast.literal_eval(a)
print(activeList)
buyList=[]
clearOrders()
sellDecide()
if activeList:
for i in activeList:
a=buyCalculate(i)
if a:
buyList.append(i)
print ('buy list: ',buyList)
if buyList:
buyDecide(buyList)
cur.close()
d=()
a=()
b=()
activeList=[]
print ('+++++++++++++END OF BLOCK+++++++++++++++')
state=True
while state==True:
cycleStart=datetime.datetime.now()
mainFlow()
cycleEnd=datetime.datetime.now()
wait=300-(cycleEnd-cycleStart).total_seconds()
print ('wait=: ' +str(wait))
if wait>0:
time.sleep(wait)
如您所见,我正在重新初始化所有变量,关闭游标,执行commit()操作以解决此类问题,我尝试了普通游标,以及缓冲区设置为True和False的游标,结果始终相同
当我从MySQL工作台运行完全相同的Select查询时,返回的结果很好
困惑,并坚持了2天。您正在更新/插入/删除事务之前执行提交 虽然从理论上讲,SELECT语句与INSERT、UPDATE和DELETE有一定的区别,因为它不修改数据库中的数据。如果要查看在另一个会话中更改的数据,则必须仅在更改后提交。每次循环后关闭光标会部分加剧这种情况 你在解决这个问题上做得太过分了;无需重置
mainFlow()方法中的所有内容(我看不出有必要使用大多数变量)
我已经删除了大量不必要的代码(并添加了空格),我已经删除了对不同事物的变量名的重用,以及对立即被覆盖的变量的声明。但这仍然不是很糟糕
由于我们对什么是clearOrders()
、SellDecise()
和buyCalculate()
没有详细的了解,您可能需要自己仔细检查一下。太棒了。我仍然不完全理解更改close()和commit()的放置位置如何更改返回的结果,但它是有效的,我接受它!当您提交事务时,您正在将更改发布到数据库中;在第一个周期中,您不发布更改,在第二个周期中,您发布第一个周期的非更改,在第三个周期中,您选择最初发布的更改(或类似的内容)。
def mainFlow():
buyList = []
cur = DBSV.cursor(buffered=True)
cur.execute("SELECT list FROM active_list WHERE id = 1")
activeList = cur.fetchone()[0]
activeList = ast.literal_eval(activeList)
clearOrders()
sellDecide()
for i in activeList:
a = buyCalculate(i)
if a:
buyList.append(i)
if buyList:
buyDecide(buyList)
DBSV.commit()
cur.close()
while True:
cycleStart = datetime.datetime.now()
mainFlow()
cycleEnd = datetime.datetime.now()
wait = 300 - (cycleEnd - cycleStart).total_seconds()
if wait > 0:
time.sleep(wait)