Rumah > Soal Jawab > teks badan
Saya sedang menulis fungsi pembantu untuk aplikasi web saya yang mengemas kini pangkalan data berdasarkan beberapa maklumat yang diperoleh daripada API luaran (bukan input pengguna). Saya mempunyai kod berikut, tetapi ia ditandakan sebagai "tidak selamat" oleh pakej python Bandit.
Sebaik-baiknya saya boleh menulis fungsi dengan cara yang mengekodkan lajur untuk dikemas kini, tetapi saya fikir ia juga boleh dilakukan secara dinamik.
Adakah ini cara yang selamat untuk mengemas kini jadual (tiada suntikan SQL mungkin)?
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)
P粉9261742882023-09-09 17:22:57
Anda harus meletakkan nama lajur dalam tanda belakang sekiranya nama lajur ialah SQL reserved keyword atau mengandungi ruang, tanda baca atau aksara antarabangsa. Juga pastikan bahawa aksara backtick dalam nama lajur digantikan dengan dua backtick.
assignments = ", ".join(f"`{k.replace('`', '``')}`=%s" for k in update_dict) statement = f"UPDATE messages SET {assignments} WHERE uid = %s"
Saya lebih suka menggunakan rentetan f daripada format().