Avoir un programme qui reçoit une liste de noms de joueurs et de résultats. Essayez ensuite de les ajouter à une base de données SQL. Si le nom du joueur est déjà sur la liste, je veux qu'il mette à jour son score en ajoutant son score actuel à celui enregistré. J'essaie de le faire en utilisant l'instruction ON DUPLICATE KEY UPDATE mais je ne sais pas comment lui dire d'utiliser la valeur. Voici mon code.

from mysql.connector.cursor import MySQLCursorPrepared
print(playerNames ,playerScore )
try:
    #MariaDB Connection
    con = mysql.connector.connect(port=5004,user='root',password='password',host='localhost',database='scoreboard')
    records_to_insert = [ (playerNames[0],playerScore[0]) ,
                        (playerNames[1],playerScore[1]),
                        (playerNames[2],playerScore[2]) ,
                        (playerNames[3],playerScore[3]) 
                        ]
    sql_insert_query = " INSERT INTO results (Player, Score) VALUES (%s,%s) ON DUPLICATE KEY UPDATE Score = VALUES(Score) + %s; "
    myCursor = con.cursor()
    myCursor.executemany(sql_insert_query, records_to_insert)

    con.commit()

Je sais que le problème est lié à l'utilisation de "= VALUES (Score) +% s", mais je ne sais pas comment lui indiquer la valeur que je souhaite utiliser. Tout avis serait grandement apprécié.

1
Kevin Moran 9 mars 2019 à 17:36

2 réponses

Meilleure réponse

Vous pouvez simplement utiliser cette expression:

INSERT INTO results (Player, Score)
    VALUES (%s, %s)
    ON DUPLICATE KEY UPDATE Score = VALUES(Score) + Score;

Remarques:

  • Cela suppose que vous avez un index unique sur Player (ou mieux encore, c'est la clé primaire).
  • Vous devez apprendre à utiliser les paramètres SQL pour transmettre des valeurs, plutôt que la substitution de chaînes.
  • Vous pouvez déclarer Score comme NOT NULL pour vous assurer qu'il a toujours des valeurs raisonnables.
0
Gordon Linoff 9 mars 2019 à 14:38
 sql_insert_query = " INSERT INTO results (Player, Score) VALUES {0},{1}) ON DUPLICATE 
 KEY UPDATE Score = VALUES(Score) + {1}; ".format(playerNames[0],playerScore[1])
-1
Aleksei Grabor 9 mars 2019 à 14:45