使用Postgres进行Python线程处理:事情没有正确更新

时间:2013-08-20 04:08:31

标签: python sql multithreading postgresql

我有一个独立运行的线程

thread.start_new_thread(listeningTF2Servers, ())

最终会调用此方法:

    def updateStats():
        ...
        for player in pastGames[i]['players']:
        ...
                        cursor.execute('SELECT yes FROM newstats WHERE nick = \'' + player['nick'] + '\' ORDER BY totalgames DESC LIMIT 1')
                        for row in cursor.fetchall():
                            if row[0] == 1:
                                if scoreDict[player['team']] == 1:
                                    cursor.execute('UPDATE newstats SET totalgames = totalgames + 1, wins = wins + 1, medicgames = medicgames + 1, medicwins = medicwins +1 WHERE nick = \'' + lower(player['nick']) + '\'')
                                    cursor.execute('COMMIT;')
                                else:
                                    #similar query
                            else:
                                if scoreDict[player['team']] == 1:
                                    cursor.execute('UPDATE newstats SET totalgames = totalgames + 1, wins = wins + 1 WHERE nick = \'' + lower(player['nick']) + '\'')
                                    cursor.execute('COMMIT;')
                                else:
                                    #similar query
       ...

这就是事情。此方法之前的线程中的其他所有工作正常。

但是updateStats()似乎工作......很奇怪。但是关于必须更新的玩家的HALF似乎没有在数据库中更新。

例如,在每场比赛之后调用此方法,以便增加玩家的游戏统计数据和获胜统计数据。但是对于一些玩家来说,这种情况绝对不会发生,即使对于玩过相同游戏的所有其他玩家来说,统计数据也会得到正确的更新。

我的代码是否存在导致线程或postgres问题的问题?或者是否有一些我不知道的SQL或postgres或Python会导致这些问题?

1 个答案:

答案 0 :(得分:1)

只是一个有根据的猜测: 对于第一个查询,您传递的内容为player['nick'],但其他调用lower(player['nick']),但所有查询都会影响newstats.nick。所以我的猜测结果会有所不同,这取决于玩家的昵称是否全部是小写的。

你应该尝试这样的事情:

lowerNick = lower(player['nick'])
...
cursor.execute('SELECT yes FROM newstats WHERE nick = %s ORDER BY totalgames DESC LIMIT 1', [lowerNick] )
...
cursor.execute('UPDATE newstats SET totalgames = totalgames + 1, wins = wins + 1, medicgames = medicgames + 1, medicwins = medicwins +1 WHERE nick = %s', [lowerNick])
...
cursor.execute('UPDATE newstats SET totalgames = totalgames + 1, wins = wins + 1 WHERE nick = %s', [lowerNick])