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 に答える