Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3中mysql select上返回的上一次更新的结果_Python_Mysql_Python 3.x - Fatal编程技术网

Python3中mysql select上返回的上一次更新的结果

Python3中mysql select上返回的上一次更新的结果,python,mysql,python-3.x,Python,Mysql,Python 3.x,我有一个在服务器上运行的脚本,该脚本更新MySQL数据库中的项目列表,以供桌面上运行的另一个脚本处理。脚本以循环方式运行,每5分钟处理一次列表(服务器端脚本也以5分钟为周期运行)。在第一个循环中,脚本检索当前列表(基本选择操作),在第二个循环中,脚本获取相同版本(未更新)的列表,在第三个循环中,脚本获取在第二次循环中应该获取的列表。在第一次之后的每次传递中,SELECT操作都会返回上一次更新操作的数据 def mainFlow(): activeList=[] d=()

我有一个在服务器上运行的脚本,该脚本更新MySQL数据库中的项目列表,以供桌面上运行的另一个脚本处理。脚本以循环方式运行,每5分钟处理一次列表(服务器端脚本也以5分钟为周期运行)。在第一个循环中,脚本检索当前列表(基本选择操作),在第二个循环中,脚本获取相同版本(未更新)的列表,在第三个循环中,脚本获取在第二次循环中应该获取的列表。在第一次之后的每次传递中,SELECT操作都会返回上一次更新操作的数据

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)