ОБНОВЛЕНИЕ MySQL с помощью Python

#python #mysql #tkinter #sql-update

Вопрос:

Я пытаюсь обновить записи из своей базы данных с именем Шаблон, клиенты таблиц. Я получаю обновленную информацию из Tkinter Treeview. Я обновляю любое поле, кроме идентификатора пользователя, который является моим первичным ключом. Я получаю синтаксическую ошибку при выполнении cur.execute(sql_command). cur определяется как мой курсор.

 # Function to Edit Record 
def edit_client():
# Update the Database
    print(user_id_box.get())
    sql_command = ("UPDATE clients SET 
        f_name = f_name_box.get(),
        l_name = l_name_box.get(),
        email = email_box.get(),
        phone = phone_box.get(),
        price = price_box.get(),
        address = address_box.get(),
        city = city_box.get(),
        state = state_box.get(),
        country = country_box.get(),
        zipcode = zipcode_box.get() WHERE user_id = user_id_box.get()")

   # Execute the SQL command
   cur.execute(sql_command)
   # Commit the changes to the database
   mydb.commit()
   # Clear the old entry
   clear_record()
   # Refresh the Data Frame
   query_database()
 

Комментарии:

1. Не ошибка отступа? Я вижу, что вы забыли пробел в каждой последующей строке sql_command .

Ответ №1:

Самым простым решением было бы использовать f-строку и фигурные скобки для правильного размещения значений внутри строки. Здесь я также использовал строки документов, так что вам не нужны обратные косые черты.

 def edit_client():
    print(user_id_box.get())
    sql_command = f"""UPDATE clients SET 
        f_name = {f_name_box.get()},
        l_name = {l_name_box.get()},
        email = {email_box.get()},
        phone = {phone_box.get()},
        price = {price_box.get()},
        address = {address_box.get()},
        city = {city_box.get()},
        state = {state_box.get()},
        country = {country_box.get()},
        zipcode = {zipcode_box.get()} WHERE user_id = {user_id_box.get()}"""

   cur.execute(sql_command)
   mydb.commit()
   clear_record()
   query_database()
 

однако
Я настоятельно рекомендую вам очистить ваши входные данные и передать их в качестве аргументов исполнителю, поскольку SQL-инъекции по-прежнему актуальны, даже если вы не заботитесь о безопасности, вы все равно можете просто прервать запрос, нарушив входные данные.

Я не знаю, какую библиотеку вы используете для связи с БД, но ее документация должна охватывать ее, если она не относится к началу 1970-х годов, созданная каким-то студентом.

Комментарии:

1. Помимо SQL-инъекции, ваше решение не работает, если какое-либо поле является строковым полем. Например , если f_name это строковое поле и f_name_box.get() возвращает John , то окончательный SQL будет чем-то вроде UPDATE ... SET f_name = John, ... того, что недопустимо. Это должно быть похоже UPDATE ... SET f_name = "John", ... . Вместо f-строки следует использовать заполнители.

Ответ №2:

Обратите внимание, что f_name.get() внутри строки подобное "f_name = f_name.get()" работать не будет.

В вашем случае вы можете использовать заполнитель ( %s для MySQL) в инструкции SQL:

 sql_command = f"""UPDATE clients
                  SET f_name = %s, l_name = %s,
                      email = %s, phone = %s,
                      price = %s, address = %s,
                      city = %s, state = %s,
                      country = %s, zipcode = %s
                  WHERE user_id = %s"""

cur.execute(sql_command, (f_name_box.get(), l_name_box.get(),
                          email_box.get(), phone_box.get(),
                          price_box.get(), address_box.get(),
                          city_box.get(), state_box.get(),
                          country_box.get(), zipcode_box.get(),
                          user_id_box.get()))
 

Комментарии:

1. Разве это невозможно использовать WHERE user_id = %s ?

2. @CoolCloud Это опечатка, спасибо за напоминание.

3. Большое спасибо. Да, это работает с заполнителем. Очень благодарен.