2013-08-20 2 views
0

У меня есть поток, который работает независимоPython резьб с Postgres: вещи не обновляется должным образом

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

Я действительно не хочу, чтобы попробовать, что ... – Joe

+0

Моя точка является: Никогда не передавайте переменные через манипуляции строки в запросе. Это открывает врата в ад и нижние царства и пробуждает Того, Кто ждет За Стеной. Пусть ваш водитель позаботится об этом. И.Е. вместо 'execute ('select 1 where a = \' '+ x +' \ '')' use 'execute ('select 1 where a =% s', [x])'. – Hyperboreus

ответ

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]) 
+0

Да ... Я только это заметил. Я думаю, что это может быть проблемой, я дважды проверю. – Joe

Смежные вопросы