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

2024-04-26 18:06:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个在服务器上运行的脚本,它更新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查询时,返回的结果很好。你知道吗

困惑,坚持了两天。你知道吗


Tags: 脚本true列表datetimeifmysqlnowlist
1条回答
网友
1楼 · 发布于 2024-04-26 18:06:34

您正在更新/插入/删除事务之前执行提交

虽然SELECT语句在理论上是DML,但它与INSERT、UPDATE和DELETE有一定的区别,因为它不修改数据库中的数据。如果要查看在另一个会话中更改的数据,则必须在更改后提交它。每次循环后关闭光标会部分加剧这种情况。你知道吗

你在解决这个问题上做得太过分了;没有必要重置mainFlow()方法中的所有内容(而且我看不出有必要使用大多数变量)

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)

我已经删除了大量不必要的代码(并添加了空格),我已经删除了对不同事物的变量名的重用,以及对立即被覆盖的变量的声明。但这仍然不是很糟糕。。。你知道吗

由于我们对clearOrders()sellDecide()buyCalculate()的确切内容没有详细的了解,您可能需要自己仔细检查一下。你知道吗

相关问题 更多 >