0

我有一个独立运行的线程

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() 似乎工作......奇怪。但是大约一半必须更新的玩家似乎没有在数据库中更新。

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

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

4

1 回答 1

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])
于 2013-08-20T05:09:09.717 回答