2016-01-11 63 views
1

我想用模擬比賽的Python代碼構建一個PostgreSQL數據庫。球員表包含四列 - 名稱,編號,勝利,比賽。更新對PostgreSQL表不能正常工作的查詢

reportMatch()函數需要兩個參數,一個特定匹配的贏家和輸家的ID,並更新數據庫中的統計信息。它將由1

def reportMatch(winner, loser): 
    conn = connect() 
    c = conn.cursor() 
    SQL = 'update players set wins = 1 where id = %s;' 
    data = (winner,) 
    c.execute(SQL, data) 
    SQL = 'update players set matches = 1 where id = %s or id = %s;' 
    data = (winner, loser) 
    c.execute(SQL, data) 

遞增1獲勝者的「勝」,和的「匹配」兩個球員,我知道我不應該設置勝匹配1,因爲它不是遞增當前值,但數據庫目前沒有匹配。所以,我第一次運行它時,將該值設置爲1可以暫時運行。

上述功能是通過客戶端代碼函數調用,testReportMatches()

def testReportMatches(): 
    registerPlayer("Bruno Walton") 
    registerPlayer("Boots O'Neal") 
    registerPlayer("Cathy Burton") 
    registerPlayer("Diane Grant") 
    standings = playerStandings() 
    [id1, id2, id3, id4] = [row[1] for row in standings] 
    reportMatch(id1, id2) 
    reportMatch(id3, id4) 
    standings = playerStandings() 
    for (n, i, w, m) in standings: 
     if m != 1: 
      raise ValueError("Each player should have one match recorded.") 
     if i in (id1, id3) and w != 1: 
      raise ValueError("Each match winner should have one win recorded.") 
     elif i in (id2, id4) and w != 0: 
      raise ValueError("Each match loser should have zero wins recorded.") 
    print "7. After a match, players have updated standings." 

registerPlayer()用於插入一個新的玩家進入球員數據庫。 playerStandings()用於獲取所有玩家的元組列表。

我遇到的問題是reportMatch()中的更新查詢,這似乎不起作用。我試圖在reportMatch()testReportMatches()的兩次調用之前和之後打印排名,但他們都有匹配並贏得0。不知何故,數據庫中的匹配和勝利沒有被更新。

回答

2

您需要在reportMatch函數的末尾與conn.commit()進行交易。

請參閱psycopg2 usage

+0

謝謝。我不敢相信我是一個白癡,所以我放棄了這個承諾。 –