J'écris une fonction d'assistance pour mon application Web qui met à jour la base de données en fonction de certaines informations obtenues à partir d'une API externe (et non d'une entrée utilisateur). J'ai le code suivant, mais il est marqué comme "dangereux" par le package Python Bandit.
Idéalement, je pourrais écrire une fonction de manière à coder en dur les colonnes à mettre à jour, mais je pense qu'il devrait également être possible de le faire de manière dynamique.
Est-ce un moyen sûr de mettre à jour une table (pas d'injection SQL possible) ?
import mysql.connector as database def update_message_by_uid(uid: str, update_dict: dict) -> None: # Fetches the previous entry from the database using the unique identifier message_info_dict = get_message_by_uid(uid) # check that all the keys of the update dict are also in the original dict assert set(update_dict.keys()) <= set( message_info_dict.keys() ), "Some of the keys in the dictionary passed are not valid database columns" # We update the entry for all entries in the dictionary containing the updates statement = 'UPDATE messages SET {} WHERE uid = %s'.format(", ".join('{}=%s'.format(k) for k in update_dict)) # Concatenates the values of the dict with the unique identifier to pass it to the execution method as one variable data = list(update_dict.values()) + [uid] cursor.execute(statement, data)
Vous devez mettre les noms de colonnes entre guillemets au cas où le nom de la colonne serait unmot-clé réservé SQLou contiendrait des espaces, des signes de ponctuation ou des caractères internationaux. Assurez-vous également que les caractères backtick dans les noms de colonnes sont remplacés par deux backticks.
Je préfère utiliser f string au lieu de format().