我有一个独立运行的线程
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会导致这些问题?
答案 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])