Python3中mysql select返回的先前更新结果

时间:2014-07-21 07:39:02

标签: python mysql python-3.x

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

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 Workbench运行完全相同的Select查询时,返回的结果很好。

感到困惑,坚持了2天。

1 个答案:

答案 0 :(得分:1)

您在UPDATE / INSERT / DELETE事务

之前执行COMMIT

虽然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)

我删除了大量不必要的代码(并添加了空格),我已经删除了对不同内容的变量名称的重用以及立即覆盖的变量声明。这仍然不是OO虽然......

由于我们并未详细了解clearOrders()sellDecide()buyCalculate()您可能想要自己仔细检查的内容。